我有这样的代码:
private void comboBox2_TextChanged(object sender, EventArgs e)
{
var price = dt.Select("desc = '" + comboBox2.Text + "'", "price ASC");
textBox9.Text = price[0][2].ToString();
}dt是一个datatable,它以如下方式持有库存项目: id、desc、price
当我从combobox (从dt中填充)中选择一个项时,它自己的代码工作得很好,但是如果我开始键入combobox,就会得到以下错误: Index超出了数组的范围。
只有当组合框与其中一个包含的项一起完成时,我才能进行查找?
太多的爱。*o)
发布于 2014-10-04 23:04:53
即使用户尚未完成输入,也总是在用户更改文本时触发该事件。由于您正在与=进行比较,所以文本必须与desc完全匹配。因此,当您尝试访问数组的第一行时,DataTable.Select不返回导致异常的任何行。
将筛选器更改为匹配子字符串。可以通过检查数组是否包含行来防止错误:
1)
var price = dt.Select("desc LIKE '*" + comboBox2.Text + "*'", "price ASC");2)
if(price.Any())
textBox9.Text = price[0][2].ToString();Sidenote,我发现更易读:
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);
}发布于 2014-10-04 23:08:40
在您的情况下,var price不返回任何内容,因为由use编写的字符串不是数据表。这段代码应该会有帮助。
if (price != null && price.Count() > 0)
{
textBox9.Text = price[0][2].ToString();
}另一种情况是使组合框类型下拉列表,用户应该只从datatable设置输入。
同样,正如the所说,这个Text_Changed事件将在用户写的每封信上执行。注意这一点!
要注意写列名,不要用索引来表示列名--这是不好的做法!
发布于 2014-10-04 23:08:44
您可以尝试将代码放入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)
{}
}https://stackoverflow.com/questions/26197946
复制相似问题