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

5

我在我的数据库网格中有一个基于查询字段的列。

问题是,最终用户无法为该字段设置空白值 - 他们只能从查询表中选择值。

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

3个回答

5
在适当的TDBGrid键事件中,捕获DEL。当检测到DEL时,检查是否在查找列中。如果是,则调用相应数据集字段上的Clear方法。

我怎样才能知道自己是否在查找列中? - croceldon
读取DBGrid.SelectedIndex或者更好的是,获取DBGrid.SelectedField,它可以直接给你字段对象来Clear()。 - Larry Lustig
1
嗯,那确实很接近。我调用的是类似 grid.SelectedField.Clear 的东西,但似乎不起作用。该字段在网格中没有受到影响。 - croceldon
1
好的,这是我想出来可行的代码: with grid.DataSource.Dataset do begin Edit; FieldByName('fieldname').Clear; Post; end;可能有更好的方法,但这个可以用。谢谢! - croceldon
很高兴我能让你接近目标,即使没有完全达成。不确定以前是否在网格中完成过这项任务,但是使用DBComboBox设置为DropDownList样式可以实现相同的想法,而且更容易返回到适当的字段对象。 - Larry Lustig

1
这是我在Delphi XE7中编写的代码。诀窍是将查找字段引用的KeyField设置为NULL,而不是查找字段本身。
请注意,一旦下拉框显示(例如双击单元格时,无论是否展开),或者如果网格选项包括dgAlwaysShowEditor,则它将不起作用。在这种情况下,按键不会传递到事件处理程序。如果我也能使其正常工作,我将更新代码。(有任何想法吗?)
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;

无论我在哪里使用(Sender),都会出现E2066缺少运算符或分号的错误,所以我无法构建这段代码。这在Delphi 10 Seattle中发生。你用它时有什么问题吗? - diedie2
@diedie2,我只是想确认一下 - 你是否将这段代码作为DBGrid的OnKeyDown事件处理程序?我刚刚在Delphi 10 Seattle中尝试编译它,没有出现任何错误。当你在属性检查器中双击OnKeyDown事件时,它是否会带你到你的代码中的这个过程,还是其他地方? - Reversed Engineer
@diedie2,请将您的代码发送给我 - 将其粘贴到此处的评论中。还请告诉我您的TDBGrid对象的名称是什么? - Reversed Engineer
我发现了我的错误,现在它已经可以工作了!非常感谢!我的错是我使用的是MainDBGrid(Sender),而不是TDBAdvGrid(Sender)。因此,我使用了组件名称而不是组件本身。我感到如此愚蠢... - diedie2

1
尝试在查找表中放置一个空值。

我想过这个 - 肯定有一种方法可以在不添加额外数据的情况下完成这个任务...? - croceldon
2
我不知道。查找的重点是根据在其他地方定义的列表给出选择。如果您开始添加不在该列表中的选项,则不再具有查找功能。 - Mason Wheeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接