下面的代码解决了您的一些问题。
主要问题是您没有正确初始化,s
并且获取所选行的字段的方式存在缺陷。
对DataSet.Disable/EnableControls
和的调用将ListBox1.Items.BeginUpdate/EndUpdate
加快该过程。
另外,避免with
像瘟疫这样的结构。如您所见,我对局部DataSet
变量的使用涉及最少的额外键入,并避免了使用时可能出现的各种意外问题with
。
procedure TForm1.GetSelected; var i, J : Integer; s : String; DataSet : TDataSet; begin if DBGrid1.SelectedRows.Count>0 then begin DataSet := DBGrid1.DataSource.DataSet; // with DBGrid1.DataSource.DataSet do try ListBox1.Items.BeginUpdate; DataSet.DisableControls; for i:=0 to DBGrid1.SelectedRows.Count-1 do begin DataSet.GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i])); s := ''; for j := 0 to DataSet.FieldCount - 1 do begin if (j>0) then s:=s+', '; s := s + DataSet.Fields[j].AsString; //s := s + FindField(Fields.Fields[j].FieldName).AsString; end; Listbox1.Items.Add(s); //s:= ''; end; finally DataSet.EnableControls; ListBox1.Items.EndUpdate; end; end; end;
**更新:**
您可以像这样将当前网格行设置为选中状态
DBGrid1.SelectedRows.CurrentRowSelected := True;
更新#2
网格的选定行存储在TBookmarkList
named中SelectedRow
。要清除当前选择,您需要做的就是调用其Clear
方法,如下所示:
procedure TForm1.btnClearSelectedClick(Sender: TObject); begin DBGrid1.SelectedRows.Clear; end;
同样,如果要清除ListBox,则只需调用其Clear
方法,如下所示:
procedure TForm1.btnClearListBoxClick(Sender: TObject); begin ListBox1.Clear; end;
如果您无法使我的代码正常工作,请尝试以下操作:
在对象检查器中,将“ DBGrid选项”属性设置dgMultiSelect
为True。
在表单及其OnClick
处理程序调用中放置一个按钮GetSelected
。
编译并运行。单击网格中的一行,然后单击按钮。没发生什么事。原因是单击按钮会将焦点移到DBGrid之外,因此就其而言,没有选择任何行。然后尝试步骤3。
再次运行该应用程序。这次Ctrl,在单击网格和按钮的同时,按住键。这次,选定的行出现在列表框中。在Ctrl按钮仍然按下的情况下,单击网格中的另一行,然后单击按钮。这次,两行都添加到ListBox中。