c# - 是否可以有一个自动填充组合框(在 datagridview 中),它还提供列中所有数据库项的下拉列表?
问题描述
所以我有一个DataGrid
使用来自MySQL数据库的数据。我试图做到这一点,以便当用户开始在“项目”列中输入时,该框将自动填充/建议/附加,并允许数据库列中所有元素的下拉列表。
到目前为止,我已经设法提供自动填充功能或下拉列表。我似乎无法让他们两个一起工作。我开始怀疑这是否可能,但我还没有找到解决方案。
于是,我发了这篇文章。如果有人有任何有用的建议。以下是我用来执行自动填充和下拉列表的一些功能。
private void invoice_DG_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
string titleText = invoice_DG.Columns[1].HeaderText;
if (titleText.Equals("ITEM"))
{
ComboBox autoText = e.Control as ComboBox;
/*if (autoText != null)
{
autoText.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
autoText.AutoCompleteSource = AutoCompleteSource.CustomSource;
//AutoCompleteStringCollection DataCollection = new AutoCompleteStringCollection();
autoText.AutoCompleteCustomSource = get_From_Database();
//autoText.Items.Add(get_From_Database());
}*/
if (e.Control is DataGridViewComboBoxEditingControl)
{
autoText.DropDownStyle = ComboBoxStyle.DropDown;
autoText.AutoCompleteSource = AutoCompleteSource.CustomSource;
autoText.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
autoText.AutoCompleteCustomSource = get_From_Database();
}
}
}
private AutoCompleteStringCollection get_From_Database()
{
AutoCompleteStringCollection Coll = new AutoCompleteStringCollection();
string querySelect = "SELECT * FROM Items";
MySqlCommand commandSelect = new MySqlCommand(querySelect, conn);
MySqlDataReader reader = commandSelect.ExecuteReader();
while (reader.Read())
{
string type = reader.ToString();
Coll.Add(type); //data inserted in collection so that it will be autocomplete when you type keywords
if (list_Loaded == false)
{
string item = reader.GetString("name");
ITEM.Items.Add(item);
}
} reader.Close();
list_Loaded = true;
return Coll;
}
注意这些功能正在发生变化,可能无法反映最终将被接受的内容。这只是他们目前的状态。
解决方案
我正在努力做到这一点,以便当用户开始在“项目”列中输入时,该框将自动填充/建议/附加,并允许数据库列中所有元素的下拉列表。
到目前为止,我要么设法提供自动填充功能,要么提供下拉列表。我似乎无法让他们两个一起工作
这里重要的是您希望用户能够附加. 因此,下拉控件不能是下拉列表,因为这将阻止用户输入列表中尚不存在的内容。我建议您将其更改为常规 的下拉控件。
典型的流程是您:
在第一次按键后显示下拉控件,并开始使用根据用户键入的内容过滤的值(是否来自数据库是偶然的)填充下拉列表。如果没有匹配项,则这是新条目的开始,因此输入的字符将成为列表中的新条目
随着输入的字符越来越多,继续过滤或将字符附加到新条目(来自 #1)
当他们按Enter/focus 离开时,选择匹配的过滤记录,或者如果它是一个新条目,则适当保存(在本例中为数据库)
您可以在 Visual Studio 中很容易地看到这种模式,打开一个 C# 文件并观察 Intellisense 的自动完成方面如何与 C# 的dynamic
关键字一起工作。通常,如果无法识别该方法,C# 自动完成类型会阻止您自动完成方法调用。
dynamic
自动完成的不同之处在于它不做任何假设,并且默认情况下不提供潜在成员。但是,它确实有添加的概念。
dynamic something = // get a reference to some object
something.Foo (); // Intellisense won't offer the Foo() suggestion.
// It won't result as a compile error either
但是,如果我们在相同的方法范围内再次尝试相同的方法调用,Intellisense 会介入并显示我们之前调用的方法Foo()
(至少在编码时)是可用的。当然,直到运行时我们才能确定。
something.Foo(); // Foo() NOT available in auto-complete
something.Foo(); // Foo() now available in auto-complete
推荐阅读
- linux - 在所有行中通过 AWK 在模式后插入字符串
- reactjs - 渲染 React highcharts x-range 图表时出错
- batch-file - 如何将 FC 结果分配给变量(批处理文件)
- .net - 如何在 Postgresql 的 DO 语句中使用查询参数?
- delphi - 自定义 dbEdit 可以接收数据集 AfterPost 和 AfterDelete 事件的通知吗?
- node.js - 无法在 NodejJS 中使用 JWT 访问受保护的路由
- google-docs - 如何删除谷歌文档中的分页符
- python - 用 numpy 进行矢量化字节位置转换?
- c++ - 哪种解决方案最好,创建连接,还是直接在 QT 中调用方法?
- javascript - 是否可以通过将文本作为查询参数传递给图像 URL 来在图像上添加文本?