[英]IndexOutOfRangeException with DataTable.Select
我有以下代码:
private void comboBox2_TextChanged(object sender, EventArgs e)
{
var price = dt.Select("desc = '" + comboBox2.Text + "'", "price ASC");
textBox9.Text = price[0][2].ToString();
}
dt是一个数据表,按以下行存储库存物料:id,desc,price
当我从组合框中选择一项(从dt填充)时,它本身的代码可以正常工作,但是如果我开始在组合框中键入内容,则会出现此错误:索引不在数组的范围内。
仅当组合框中包含其中一项时,才如何查找?
非常喜欢。 :o)
即使用户尚未完成键入操作,也始终在用户(程序)更改文本时触发该事件。 由于您要与=
进行比较,因此文本必须与desc
完全匹配。 因此,当您尝试访问数组的第一行时, DataTable.Select
返回任何导致异常的行。
更改过滤器以匹配子字符串。 您可以通过检查数组是否包含行来防止错误:
1)
var price = dt.Select("desc LIKE '*" + comboBox2.Text + "*'", "price ASC");
2)
if(price.Any())
textBox9.Text = price[0][2].ToString();
旁注,我发现LINQ-To-DataTable更具可读性:
var foundRows = from row in dt.AsEnumerable()
let desc = row.Field<string>("desc")
where desc.Contains(comboBox2.Text)
select row;
DataRow firstMatch = foundRows.FirstOrDefault();
if(firstMatch != null)
{
textBox9.Text = firstMatch.Field<string>(2);
}
在您的情况下,var price不会返回任何内容,因为使用的字符串不是数据表。 此代码应有所帮助。
if (price != null && price.Count() > 0)
{
textBox9.Text = price[0][2].ToString();
}
另一种情况是制作组合框类型下拉列表,并且用户应仅从数据表设置输入。
就像Tim Schmelter所说的那样,此Text_Changed事件将在用户写的每个字母上执行。 注意这一点!
PS请注意写列名,不要对列名使用索引,这不是一个好习惯!
您可以尝试将代码放在try catch块中,然后将以静默方式处理抛出的异常,并在给出正确输入后显示有效答案,您可以使用如下代码:
private void comboBox2_TextChanged(object sender, EventArgs e)
{
try
{
var price = dt.Select("desc = '" + comboBox2.Text + "'", "price ASC");
textBox9.Text = price[0][2].ToString();
}
catch(Exception xyz)
{}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.