给DBGrid动态赋值后,如何用程序指定某行某列为当前焦点?(100分)

给DBGrid动态赋值后,如何用程序指定某行某列为当前焦点?主要是如何指定列,行我能够指定,用DBGrid1.DataSource.DataSet.RecNo := 2;就行了,但是列我不会,请大家教我。谢谢!


让第3行第2列(“用户名称”列)获得焦点:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB;

type
TForm1 = class(TForm)
ADOTable1: TADOTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOTable1.RecNo := 3;
ADOTable1.FieldByName(‘用户名称‘).FocusControl;
end;

end.

如果希望是第2列获得焦点(字段数组下标从0开始):
ADOTable1.RecNo := 3;
ADOTable1.Fields[1].FocusControl;

有一个问题,我的修改窗口是Form_ShangPinZiLiaoModi.ShowModal; 弹出的,所以
Form_ShangPinZiLiaoModi.Close; Form_KuCunGuanLi.DBGrid1.DataSource.DataSet.RecNo := CurrentNumber; Form_KuCunGuanLi.DBGrid1.DataSource.DataSet.Fields[3].FocusControl;
出现错误,错误内容是“cannot focus a disabled or invisible window”,
我应该怎么改呢?
谢谢!

“cannot focus a disabled or invisible window”错误的原因是DBGrid1所在的窗口还没有显示出来,操作某控件的Focus时其所在的窗口必须是已经显示出来的。所以你需要把
Form_KuCunGuanLi.DBGrid1.DataSource.DataSet.RecNo := CurrentNumber; Form_KuCunGuanLi.DBGrid1.DataSource.DataSet.Fields[3].FocusControl;
放在窗口显示出来以后的操作中。
另外FocusControl方法是字段对象的方法,所有的数据集控件都应该是可以的。

窗口2打开时焦点定位在DBGrid1的3行2列:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses
unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.ShowModal;
end;

end.

************************************************

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids;

type
TForm2 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADOTable1: TADOTable;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
ADOTable1.RecNo := 3;
ADOTable1.Fields[1].FocusControl;
end;

end.
还是改不好。我这个是MDI程序,MainForm中 Form1.ShowModal,Form1中Form2.ShowModal,Form1中有DBGrid,Form2是修改窗口,Form2修改之后
Form1.DBGrid1.Fields[3].FocusControl;出错。不用Form2直接在Form1中也不好用。
真是不好改。
你在Form2上做了什么操作后Form1.DBGrid1.Fields[3].FocusControl出的错?把代码贴上来看看比较好找出问题。
MainForm中:
procedure TMainForm.Button1Click(Sender: TObject);
begin
Form1.ShowModal;
end;

Form1中:
procedure TForm1.FormShow(Sender: TObject);
begin

try
if DataModule1.ADOConnection1.Connected then
begin
sql2 := ‘select XuHao as 序号,zhengshuhao as 证书号,kuanhao as 款号,‘ +
‘xiaojia as 销价,rukuliang as 入库量,zhiquanhao as 指圈号,‘ +
‘shouhuoriqi as 收货日期,xiaoshouriqi as 销售日期,fanghuodanwei‘ +
‘ as 放货单位,nid as ID from KuCunInfo order by xuhao‘;

DataModule1.ADOQuery1.Close;
DataModule1.ADOQuery1.SQL.Text := sql2;
DataModule1.ADOQuery1.ExecSQL ;
DataModule1.ADOQuery1.Active := true;
end;

finally
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
{修改KuCunInfo中的数据}

try
Form1.DBGrid1.Fields[3].FocusControl;
finally
end;
end;

这样就出错了,不用在Form2中修改。
哈哈,我弄出来了。在大富翁上搜索的。
Form1.DBGrid1.SelectedIndex := 4;
Form1.DBGrid1.SetFocus;
这样就行了。
谢谢你!
procedure TForm1.Button1Click(Sender: TObject);
begin
{修改KuCunInfo中的数据}
//修改完库存信息后,由于Form1中的数据还是旧的,所以需要在这里更新一下Form1中
//的数据,即:重新打开一次DBGrid1对应的数据集控件(DataModule1.ADOQuery1),然后
//再执行FocusControl
try
Form1.DBGrid1.Fields[3].FocusControl;
finally
end;
end;

另外以下代码:
DataModule1.ADOQuery1.Close;
DataModule1.ADOQuery1.SQL.Text := sql2;
DataModule1.ADOQuery1.ExecSQL ;
DataModule1.ADOQuery1.Active := true;
建议这样写:
DataModule1.ADOQuery1.Close;
DataModule1.ADOQuery1.SQl.Clear;
DataModule1.ADOQuery1.SQL.Add(sql2);
DataModule1.ADOQuery1.Open;
ADOQuery1控件,如果其SQL为select语句使用Open,如果是Insert、update、delete等不需要返回值的SQL用ExecSQL 。

原文地址:https://www.cnblogs.com/jijm123/p/11247946.html

时间: 2024-08-30 02:40:58

给DBGrid动态赋值后,如何用程序指定某行某列为当前焦点?(100分)的相关文章

C#反射动态赋值

很多时候我们需要在数据实体层读取数据后赋值到领域模型时往往会产生如下的代码 1 public class A 2 { 3 public string Name {get;set;} 4 public int Age {get;set;} 5 } 6 7 public class B 8 { 9 public string Name {get;set;} 10 public int Age {get;set;} 11 } 12 13 static void main(string[] args)

C# 实体/集合差异比较,比较两个实体或集合值是否一样,将实体2的值动态赋值给实体1(名称一样的属性进行赋值)

1 /// <summary> 2 /// 实体差异比较器 3 /// </summary> 4 /// <param name="source">源版本实体</param> 5 /// <param name="current">当前版本实体</param> 6 /// <returns>true 存在变更 false 未变更</returns> 7 protected

URL动态赋值

url动态赋值: 指的是url中包含{selector},即花括号括起来的jQuery选择器,当提交该url时,框架会自动将selector对应元素的值替换到花括号所占区域. (感觉实现了一点类似el表达式的效果) 后面的文档中,凡是标记有D-Url字样的URL参数,均支持动态赋值,通常支持动态赋值的url,同时支持warn参数,warn参数携带动态赋值不成功的提示信息. 我没有测试成功,后面成功了补上来. 只有在url属性中可以看到D-Url的url才可以动态赋值,例如: <script ty

Inno Setup入门(十一)——完成安装后执行某些程序

Inno Setup入门(十一)——完成安装后执行某些程序 2011-02-16 16:24:23|  分类: Inno Setup |  标签:inno  setup   |举报 |字号 订阅 下载LOFTER客户端 有些时候我们的程序虽然能够很好的完成安装,但是程序的配置工作可能需要其他的一些程序来辅助完成,如果不执行这些程序,主程序就不能很好的完成工作,甚至不能完成工作,一个很明显的例子是,目前许多程序是通过NET技术开发的,这就要求计算机上必须安装有.net Framework,否则主程

Jquery为下拉列表动态赋值与取值,取索引

接触前端也不久对jquery用的也只是皮毛,写过去感觉能复用的发出来,大家指点下 1.下拉列表动态赋值 function initddlYear() { var mydate = new Date(); var startYear = mydate.getFullYear() - 50; var endYear = mydate.getFullYear() + 50; for (var i = startYear; i < endYear; i++) { jQuery("#ddlYear&

javascript如何解析json对javascript如何解析json对象并动态赋值到select列表象并动态赋值到select列表

原文 javascript如何解析json对象并动态赋值到select列表 JSON(JavaScriptObject Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包. JSON的规则很简单:对象是一个无序的“‘名称/值’对”集合.一个对象以“{”(左括号)开始,“}”(右括号)结束.每个“名称”后跟一个“:”(冒号):“‘名称/值’对”之间使用“,”(逗号)分隔. 在开

摸索百天后第一个程序之深入研究和实现

    进入实验室快一百天了,从刚开始阅读老师给的几大包英文文献,期间那种科技专用术语的晦涩和cs专业知识的欠缺对我的自信心造成了很大的摧残,好在我坚持下来了,谢谢自己.     在这里我知道我之前工作过,和其他人不一样,应该对自己有不一样的要求,这种思想也给了我无形中的压力,慢慢在自己的调整下我稳步向前进步着,从不知道自己学什么到现在---我在老师给的shape grammars的项目研究中摸索到它需要很多machine learning 的知识和一些编程技术,以及其他一些计算机思想 .  

使用 Attribute +反射 来对两个类之间动态赋值

看同事使用的 一个ORM 框架 中 有这样一个功能  通过特性(附加属性)的功能来 实现的两个类对象之间动态赋值的 功能 觉得这个功能不错,但是同事使用的 ORM 并不是我使用的  Dapper  所以就自己写了一个实现同样功能的 工具类出来. 发个贴 为其他有这方面需求的人 来做个参考. 希望大家多提点意见. using System; using System.Collections.Generic; using System.Linq; using System.Reflection; u

Highcharts 柱状图为series 动态赋值

最近公司做的项目有用到 Highcharts 中的柱状图,Highcharts官网给出的范例中series属性的值是固定的: 而我做的项目需要给series赋的值是动态地从数据库取的,这样的话可以事先将取到的值转化为Json格式的数据,然后再给series赋值. 代码如下: var JsonSeries; //[{name:'n1',data:[1,2,3]},{name:'n2',data:[4,5,6]},{name:'n3',data:[7,8,9]}]中name和data的值是数据库中取