DataTable.Select的IndexOutOfRangeException

时间:2014-10-04 22:55:47

标签: c# .net winforms combobox datatable

我有这段代码:

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)

3 个答案:

答案 0 :(得分:2)

当用户(程序)更改文本时,即使他尚未完成输入,也会触发该事件。由于您要与=进行比较,因此文字必须完全与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,我发现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);
}

答案 1 :(得分:1)

在你的情况下var的价格不会返回任何东西,因为使用的写字符串不是数据表。这段代码应该有帮助。

        if (price != null && price.Count() > 0)
        {
            textBox9.Text = price[0][2].ToString();
        }

其他情况是制作组合框类型下拉列表,用户只应设置数据表的输入。

同样Tim Schmelter说这个Text_Changed事件将在用户写的每个字母上执行。请注意这一点!

请注意编写列名,不要使用索引作为列名,这不是好习惯!

答案 2 :(得分:1)

您可以尝试将代码放在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)
    {}
}