繁体   English   中英

具有DataTable.Select的IndexOutOfRangeException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM