紧急求助:请问如何知道从dbgrid1.Columns[0]的picklist中选中项的index?(50分)

  • 主题发起人 主题发起人 puremoonstone
  • 开始时间 开始时间
P

puremoonstone

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好!
请问如何知道从dbgrid1.Columns[0]的picklist中选中项的index?
 
看看TSTRINGS的帮助
很EASY的
 
picklist.indexof()
 
我现在用dbgrid来输入数据,第一项是从下拉列表中选或由用户自行输入。我想判断
该数据是否是从下拉列表中输入的,请问该怎样判断?
 
下拉列表中的数据是从adotable中读来的,不固定的。能不能举个例子呀?谢谢!
 
我现在用dbgrid来输入数据,第一项是从下拉列表中选或由用户自行输入。我想判断
该数据是否是从下拉列表中输入的,请问该怎样判断?

如果用户输入的和你下拉列表中的某一个字符串完全相同
你怎么判

你不是这个意思吧

DBGRID的这个功能我从不使用
参照我的如下!!!代码吧.

procedure TCQBroker.AssembleParamDispModeItems(AStrings: TStrings);
const
strSql = 'SELECT * FROM PMIS.COM_CQ_DISPMODE WHERE DISPMODE_DISPLAY NOT IN '
+ ' (''CQ_DM_LONGTEXT'', ''CQ_DM_PICTURE'', ''CQ_DM_OLEDOC'') ORDER BY DISPMODE_DISPINDEX';
begin
AStrings.Clear;
with FCallDB do
begin
SqlOpen(strSql);
with DataSet do
begin
while not EOF do
begin
AStrings.AddObject(FieldByName('DISPMODE_NAME').AsString,
TObject(FieldByName('DISPMODE_ID').AsInteger));
Next;
end;
SqlOpenEnd;
end;
end;
end;

procedure TCQParamForm.FormShow(Sender: TObject);
begin
inherited;
with CQBroker do
begin
AssembleFieldTypeItems(dxrParamFieldType.Items);
AssembleParamDispModeItems(dxrParamDispModeID.Items);
end;
end;

procedure TCQParamForm.RefreshFormControlsData(ANode: TTreeNode);
begin
Assert(ANode.Data <> nil);
with CQBroker do
begin
dxrParamDataSource.Items.Clear;
if TObject(ANode.Parent.Parent.Parent.Parent.Data) is TCQDataSet then
AssembleParamDataSourceItems(dxrParamDataSource.Items,
TCQDataSet(ANode.Parent.Parent.Parent.Parent.Data).CQID);
end;
with TCQParam(ANode.Data) do
begin
dxrParamName.Text := CQName;
dxrParamCode.Text := CQCode;
dxrParamNote.Text := CQNote;
dxrParamFieldType.Text := CQFieldType;
dxrParamTitle.Text := CQTitle;
dxrParamDispModeID.Text := dxrParamDispModeID.Items.Strings[dxrParamDispModeID.
Items.IndexOfObject(TObject(CQDispModeID))]; //!!!!!!!!!!
dxrParamIgnorable.Text := CQIgnorable;
dxrParamDefaValue.Text := CQDefaValue;
dxrParamDataSource.Text := CQDataSource;
end;
end;

procedure TCQParamForm.bbtnSaveClick(Sender: TObject);
begin
inherited;
with TCQParam(Node.Data) do
begin
CQName := dxrParamName.Text;
CQCode := dxrParamCode.Text;
CQNote := dxrParamNote.Text;
CQFieldType := dxrParamFieldType.Text;
CQTitle := dxrParamTitle.Text;
CQDispModeID := Integer(dxrParamDispModeID.Items.Objects[dxrParamDispModeID.
Items.IndexOf(dxrParamDispModeID.Text)]); ////!!!!!!!!!!
CQIgnorable := dxrParamIgnorable.Text;
CQDefaValue := dxrParamDefaValue.Text;
CQDataSource := dxrParamDataSource.Text;
DbUpdate;
UpdateTreeNode(Node);
end;
end;
 
可以不考虑用户输入的与下拉列表的数据项相同的情况。我只需要判断用户是否从下拉列表
选择了数据即可。
谢谢你的代码,我会好好研究。现在,我想找一个简单的办法,不知道能不能通过一个属性
之类的就能判断。最好请给出一个例子,谢谢!
 
to puremoonstone:
eguy说得对呀,比如在一个Button的OnClick里判断当前行的第一个字段值取自
PickList的第几项,可以这样写——

procedure TForm1.Button1Click(Sender: TObject);
var
n: Integer;
begin
n := DBGrid1.Columns[0].PickList.IndexOf(DBGrid1.Columns[0].Field.AsString);
if n <> -1 then ShowMessage(Format('您选择了第%d项', [n + 1]));
end;
 
dq,eguy上面的方法的确可行,谢谢!
不过,如果要考虑用户输入的数据项与下拉列表中的数据项相同的情况,(即只要输入的
数据项在下拉列表中则显示出它是第几项),应该怎么作呢?如果要将新输入的数据项保存,
以便下次它能出现在下拉列表中,应该怎么作呢?(我是通过一个adotable来保存下拉列表
的)
 
保存可以这样做,在ADOTable的AfterPost事件里——
procedure TForm1.ADOTable1AfterPost(DataSet: TDataSet);
var
s: String;
begin
s := ADOTable1.Fields[0].AsString;
if DBGrid1.Columns[0].PickList.IndexOf(s) = -1 then
DBGrid1.Columns[0].PickList.Add(s);
end;

>>只要输入的数据项在下拉列表中则显示出它是第几项
不明白什么意思,你是说在什么时机进行判断?
反正方法还是PickList.IndexOf;试试ADOTable的AfterEdit事件。
 
我的意思是:有时候,用户自行输入的数据项已经在下拉列表中存在了,但如果用
picklist.indexof判断,它返回的值还是-1,(我希望此时返回的值是它在下拉列表中对应
的索引值)我想能对这种情况进行特殊处理(如果将dbgrid1.columns[1].field与
adotable1.field[1]逐一比较的话,速度很慢,效率不高,而且indexof就没多大用了),
有没有好一点的方法呢?
 
不会吧?IndexOf判断不出来?
只能说明没有完全匹配。把你的代码和PickList里的东东帖出来看看。
 
多人接受答案了。
 

Similar threads

后退
顶部