Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在TDBGrid中的查找字段上允许空白值?_Delphi - Fatal编程技术网

Delphi 如何在TDBGrid中的查找字段上允许空白值?

Delphi 如何在TDBGrid中的查找字段上允许空白值?,delphi,Delphi,我的dbgrid中有一个基于查找字段的列 问题是最终用户不能为字段设置空白值-他们只能从查找表中选择值 如何允许最终用户删除或“清空”列的值?尝试在查找表中输入空白值。在相应的TDBGrid键事件中,删除陷阱。检测到时,检查是否在查找列中。如果是这样,请在相应的数据集字段上调用Clear。以下是我在Delphi XE7中工作的代码。诀窍是将lookup字段引用的KeyField设置为NULL,而不是将lookup字段本身设置为NULL 请注意,一旦显示下拉框,例如双击单元格(无论是否下拉),或者

我的dbgrid中有一个基于查找字段的列

问题是最终用户不能为字段设置空白值-他们只能从查找表中选择值


如何允许最终用户删除或“清空”列的值?

尝试在查找表中输入空白值。

在相应的TDBGrid键事件中,删除陷阱。检测到时,检查是否在查找列中。如果是这样,请在相应的数据集字段上调用Clear。

以下是我在Delphi XE7中工作的代码。诀窍是将lookup字段引用的KeyField设置为NULL,而不是将lookup字段本身设置为NULL

请注意,一旦显示下拉框,例如双击单元格(无论是否下拉),或者如果网格的选项包括dgAlwaysShowEditor,则该选项将不起作用。在这种情况下,按键不会传递给事件处理程序。如果我让它也能工作,我会更新代码。(有什么想法吗?)


我想到了这一点-当然有一种方法可以做到这一点而不添加额外的数据…?我不知道。查找的目的是根据其他地方定义的列表为您提供选择。如果开始添加不在该列表中的选项,则不再进行查找。如何判断我是否在查找列中?请阅读DBGrid.SelectedIndex,或者更好的是,阅读DBGrid.SelectedField,它将直接为您提供要清除()的字段对象。嗯,这非常接近。我正在调用grid.SelectedField.Clear之类的东西,但它似乎不起作用。该字段在网格中不受影响;FieldByName(“fieldname”)。清除;邮递结束;也许这是一个更好的方法,但它是有效的。谢谢很高兴我能接近你,即使不是一路。我不确定我以前是否在网格中这样做过,但我将DBComboBox设置为DropDownList样式-相同的想法,但更容易返回到相应的字段对象。无论使用哪一个(发送方),我都会得到错误E2066缺少运算符或分号。所以我无法生成此代码。德尔福10号西雅图。您的工作情况如何???@diedie2,只是检查一下-您是否将此作为DBGrid的OnKeyDown事件处理程序?我刚刚试着用Delphi 10西雅图版编译它,没有发现任何错误。当您双击属性检查器中的OnKeyDown事件时,它会将您带到代码中的此过程还是其他地方?@diedie2,请将您的代码发送给我-将其粘贴到此处的注释中。还请告诉我您的TDBGrid对象的名称?我发现了错误,现在它正在工作!非常感谢!我的错误是使用MainDBGrid(发送方)而不是TDBAdvGrid(发送方)。因此,我使用组件的名称,而不是组件本身。我觉得自己很愚蠢。。。
procedure TformMain.DBGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  LookupResultField : TField;
begin
  if Key = VK_DELETE then
    if TDBGrid(Sender).SelectedField.FieldKind = fkLookup then begin   // if this field is a lookup field

      if not (TDBGrid(Sender).DataSource.DataSet.State in [dsInsert, dsEdit]) then  // if the query is not already in edit mode
        TDBGrid(Sender).DataSource.DataSet.Edit;

      LookupResultField := TDBGrid(Sender).DataSource.DataSet.FieldByName (TDBGrid(Sender).SelectedField.KeyFields);
      LookupResultField.Clear;            // set the field to NULL

    end;
end;