Dar*_*lli 1 database delphi lookup combobox dataset
我已经在网上阅读了各种各样的文档,关于什么应该是一个非常普遍和无痛的实现.因为我没有找到一致和光滑的回复(即使Embarcadero网站描述了一些错误的属性!)我将发布一个"短"的howto.
典型的,经常使用的情况:开发人员只想在组合框中显示一些数据库提取的信息(即语言选择),从中获取用户的选择,就是这样.
要求:
id和value字段的简单表.首先,我们决定排序顺序是否是我们想要的顺序,以及是否必须显示该表中的所有项目.通常,简单ORDER BY子句或DataSet索引就足够了.如果不是,我们可以添加一个sort_order字段并用表示我们自定义排序顺序的整数填充它.如果我们只想显示一些项目,我们添加一个visible或enabled字段并在我们的SQL中使用它.例:
SELECT id, value
FROM my_database_table
WHERE visible = 1
ORDER BY sort_order
Run Code Online (Sandbox Code Playgroud)
我已将其定义visible为INTEGER并对其进行检查,1而不是TRUE因为许多数据库(包括最常用的SQLite)几乎不支持布尔值.
然后是一个可选但令人惊讶的好主意:在表单上临时添加TDBGrid,将其链接到TLookupComboBox的相同TDataSource,并检查您是否确实看到所需数据填充它.事实上,很容易在查询中输入错误(假设你使用的是SQL数据集)并且没有数据,然后你就会想知道为什么TDBLookupComboBox不会填写.一旦看到数据正确显示,就删除网格.
另一个明智的想法是将ClientDataSets用于这些类型的实现:由于它们的工作方式,它们将在程序启动时"缓存"查找中包含的几行,然后不再需要进一步的数据库访问(以及减速和流量) .
现在打开TDBLookupComboBox属性并仅填写以下内容:
ListSource(而不是 DataSource):将其设置为连接到要显示其值的DataSet的TDataSource.
ListField:将其设置为您希望用户看到的字段名称.在我们的演示案例中,它就是这个value领域.
KeyField:将其设置为您希望程序返回您的值的字段名称.在我们的演示中,它将成为id现场.
不要忘记检查TabOrder属性,仍然有人喜欢通过TAB按键导航控件,没有什么比看到选择随机跳转更令人讨厌,因为尽管图形显示第二个,但是ComboBox最后放在窗体上!
如果您只需要显示一个表单并在用户按下按钮时读取TDBLookupComboBox选择的值,那么您几乎可以进行排序.
您只需在按钮的OnClick事件处理程序中执行此操作,即可使用以下代码读取组合框值:
SelectedId := MyCombo.KeyValue;
Run Code Online (Sandbox Code Playgroud)
哪里SelectedId有变量存储返回值的位置MyCombo,当然是TDBLookupComboBox的名称.请注意KeyValue不会包含用户在屏幕上看到的文本,而是包含id我们指定的字段的值KeyField.因此,如果我们的用户选择了数据库行:
id= 5
value= 'MyText'
Run Code Online (Sandbox Code Playgroud)
MyCombo.KeyValue应包含5.
但是,如果您需要动态更新表单上的内容,取决于组合框用户选择,该怎么办?OnChange我们的TDBLookupComboBox 没有可用的活动!因此,如果你需要根据组合框选择动态更新内容,你显然不能.您可以尝试各种"OnExit"等事件,但所有事件都有严重的缺点或副作用.
一种可能的解决方案是创建一个继承自TDBLookupComboBox的新组件,其唯一任务是公开隐藏的OnChange事件.但这太过分了,不是吗?
还有另一种方法:转到你的TDBLookupComboBox绑定的DataSet(通过DataSource).打开它的事件并双击它的OnAfterScroll事件.在那里你可以很好地模拟一个OnChange事件.为了演示,在表单中添加一个整数变量和一个TEdit框并调用它们:SelectedId和EditValue.
procedure TMyForm.MyDataSetAfterScroll(DataSet: TDataSet);
var
SelectedId : integer;
begin
SelectedId := MyDataSet.FieldByName('id').AsInteger;
EditValue.Text := MyDataSet.FieldByName('value').AsString;
end;
Run Code Online (Sandbox Code Playgroud)
就是这样:您可以根据用户在组合框中的选择,使用您自己的过程调用以及动态更新表单所需的任何其他内容来替换这两个演示行.
一点警告:使用DataSet OnAfterScroll也有一个缺点:事件的调用次数比你想象的要频繁.例如,可以在打开数据集时调用它,但在记录导航期间也可以多次调用它.因此,您的代码必须处理比需要更频繁的调用.
此时你可能会搓手并认为你的工作已经完成!
一点也不!只需创建一个实现上述所有内容的简短演示应用程序,你会发现它没有重要的画龙点睛:当它启动时,组合框有一个恼人的"空白"默认选择.也就是说,即使您的数据库持有4个选项,表单也会首先显示一个空的组合框选择值.如何使您的选择在您和您的用户期望的组合框中自动显示为"预先选择"?
简单!
只需为我们上面已经描述过的KeyValue属性赋值.也就是说,在OnFormCreate其他合适的事件上,只需硬编码一个选项,例如:
MyCombo.KeyValue := DefaultId;
Run Code Online (Sandbox Code Playgroud)
例如,通过使用上面发布的示例数据库行,您可以编写:
MyCombo.KeyValue := 5;
Run Code Online (Sandbox Code Playgroud)
当用户打开表单时,组合框将显示:"MyText"作为预先选择的选项.
当然,您可能更喜欢更优雅和相关的方法来设置默认密钥而不是硬编码其默认值.在示例中,您可能希望显示数据库表或其他任何标准中包含的第一个按字母顺序排列的文本描述.但基本机制如上所示:以您想要的任何方式获取键/ id值,然后将其分配给KeyValue属性.
感谢您阅读此HowTo直到最后!
| 归档时间: |
|
| 查看次数: |
12462 次 |
| 最近记录: |