【发布时间】:2019-08-22 17:18:39
【问题描述】:
我有一个“DataTable”,其中填充了 SqlServer 表中的项目。 “DataTable”中有两列:“id”是 SqlServer 表中行的标识值,“job”是对象的名称。
我有一个使用“.Net”框架用“C#”编写的数据库客户端。它包含一个“ListBox”、一个“TextBox”、一个“DataTable”和一个“DataView”。 'DataView' 'DataSource' 设置为 'DataTable'。 'ListBox' 'DataSource' 设置为 'DataView'。表中有 1700 行。
我首选的查找正确项目的方法是让用户开始在文本框中输入,并且随着每个字母列表逐渐减少,直到用户可以轻松找到所需的项目。然后用户可以双击它并采取一些行动。我已经将这种技术与“BindingSource”一起使用,并且效果很好。我在使用“DataView”时遇到问题。用户键入的前两个字母效果很好。但是当输入第三个字母时,'ListBox' 变为空白,即使过滤器字符串是正确的。为什么它停止使用第三个字母?任何帮助将不胜感激。
这是“工作”字段中的数据样本:“08-CBM-01 -- Water Utilities Topo Survey” “id”字段中的数据只是来自 SqlServer 的“int”标识。
我已经尝试检查变量 strLookup 和 strFilter,因为使用键盘进行了输入,并且看起来这些都是正确的。
DataTable tblSelectList;
DataView dvSelectList;
private string strFilter = "";
private string strLookup = "";
private void tbLookup_TextChanged(object sender, EventArgs e)
{
strLookup = tbLookup.Text.ToString();
if (strLookup.Length > 1)
{
strFilter = "job Like '%" + strLookup + "%'";
dvSelectList.RowFilter = strFilter;
}
else { dvSelectList.RowFilter = "job = 'z'"; }
btnDone.Enabled = false;
}
private void SetupLbSelect()
{
if (dvSelectList == null) { dvSelectList = new DataView(tblSelectList); }
lbSelect.DataSource = dvSelectList;
dvSelectList.RowFilter = "job = 'z'";
lbSelect.DisplayMember = "job";
lbSelect.ValueMember = "id";
}
没有错误消息。 ListBox 开始按预期填充第一个两个字符,然后第三个字符变为空白。我希望输入“Topo”并显示所有包含“Topo”的项目。
【问题讨论】:
-
代码有效。根据您的示例数据,“job = 'z'”应该意味着列表为空。你可能想要
if (strLookup.Length > 0)而不是> 1。 -
谢谢 LarsTech。在阅读了您的文本后,我从代码页中删除了该过程,以及其他几个过程并重新输入了它们。然后代码按预期为我工作。我使用 strLookup.Length > 1 因为使用 0 产生了太多记录。在 1,700 个项目的列表中,我认为在产生结果之前要求两个字符是合理的。这次我使用了 DataView 而不是 BindingSource,因为我认为 DataView 会使用更少的资源。你知道这是不是真的吗?
-
没关系。使用适合您的工具。