";对象引用未设置为对象的实例“;筛选dataGridView时

本文关键字:实例 筛选 dataGridView 对象引用 quot 设置 对象 | 更新日期: 2023-09-27 18:28:10

我有这个搜索功能,为了标记MySQL数据库中与关键字列表匹配的评论,标记的评论将显示在dataGridView_flaggedComments上,然后用相关的股价符号(例如BARC、LLOY、TSCO)填充comboBox_stockIndex

private void button_Search1_Click(object sender, EventArgs e)
{
    commentCount = 0;
    dataGridView_flaggedComments.Refresh();
    DataTable flaggedcomments = new DataTable("flaggedcomments");
    using (MySqlConnection sqlConn = new MySqlConnection(strProvider))
    {
        using (MySqlDataAdapter da = new MySqlDataAdapter("SELECT Comment_ID, Comments_Date, Comments_Time, Author, Title, Comments_Comment, Tickers_Ticker_ID FROM comments ORDER BY Comments_Date ASC, Comments_Time ASC", sqlConn))
        {
            da.Fill(flaggedcomments);
        }
    }
    StringBuilder sb = new StringBuilder();
    string[] words = File.ReadAllLines(sourceDirTemp + comboBox_crimeKeywords.SelectedItem.ToString() + ".txt");
    var query = flaggedcomments.AsEnumerable().Where(r => words.Any(wordOrPhrase => Regex.IsMatch(r.Field<string>("Comments_Comment"), @"'b" + Regex.Escape wordOrPhrase) + @"'b", RegexOptions.IgnoreCase)));
    dataGridView_flaggedComments.DataSource = query.AsDataView();
    PopulateStockIndex();
}

private void PopulateStockIndex()
{
    comboBox_stockIndex.Items.Clear();
    comboBox_stockIndex.Items.Add("Choose to Filter");
    DataTable link_stockIndex = new DataTable("link_stockIndex");
    using (MySqlConnection sqlConn = new MySqlConnection(strProvider))
    {
        using (MySqlDataAdapter da = new MySqlDataAdapter("SELECT Ticker_ID, Symbol FROM tickers", sqlConn))
        {
            da.Fill(link_stockIndex);
        }
    }
    foreach (DataRow da in link_stockIndex.Rows)
    {
        for (int i = 0; i < dataGridView_flaggedComments.Rows.Count - 1; i++)
        {
            if (dataGridView_flaggedComments.Rows[i].Cells["Tickers_Ticker_ID"].Value.ToString() != "" && dataGridView_flaggedComments.Rows[i].Cells["Tickers_Ticker_ID"].Value.ToString() == da["Ticker_ID"].ToString())
            {
                if (!comboBox_stockIndex.Items.Contains(da[1].ToString()))
                {
                    comboBox_stockIndex.Items.Add(da[1].ToString());
                }
                comboBox_stockIndex.SelectedIndex = 0;
            }
        }
    }            
}

接下来,如果我从comboBox_stockIndex中选择一个符号,则应过滤dataGridView_flaggedComments以仅显示与所选符号相关的注释(一旦选择了符号,它将查找符号的Tickers_Ticker_ID,然后按Tickers_Ticker_ID进行过滤)。但是下面的代码不起作用。这一行的(dataGridView_flaggedComments.DataSource as DataTable).DefaultView.RowFilter = string.Format("Tickers_Ticker_ID = '{0}'", da["Ticker_ID"]);出现一个错误:"Object reference not set to a instance of a Object。"。我试着调试,但我不明白出了什么问题。

private void comboBox_stockIndex_SelectedIndexChanged(object sender, EventArgs e)
{
    DataTable link_stockIndex = new DataTable("link_stockIndex");
    using (MySqlConnection sqlConn = new MySqlConnection(strProvider))
    {
        using (MySqlDataAdapter da = new MySqlDataAdapter("SELECT Ticker_ID, Symbol FROM tickers", sqlConn))
        {
            da.Fill(link_stockIndex);
        }
    }
    foreach (DataRow da in link_stockIndex.Rows)
    {
        for (int i = 0; i < dataGridView_flaggedComments.Rows.Count - 1; i++)
        {
            if (dataGridView_flaggedComments.Rows[i].Cells["Tickers_Ticker_ID"].Value.ToString() != "" && comboBox_stockIndex.SelectedItem.ToString() == da["Symbol"].ToString())
            {
                (dataGridView_flaggedComments.DataSource as DataTable).DefaultView.RowFilter = string.Format("Tickers_Ticker_ID = '{0}'", da["Ticker_ID"]);
            }
        }
    }
}

我已经花了两天时间研究这个问题,SOF是我的最后手段。任何帮助都将不胜感激!非常感谢!

";对象引用未设置为对象的实例“;筛选dataGridView时

DataView不是DataTable

此处您将DataSoure设置为DataView:

dataGridView_flaggedComments.DataSource = query.AsDataView();

在这里,您将其铸造为DataTable:

(dataGridView_flaggedComments.DataSource as DataTable).DefaultView.RowFilter =...

所以,如果我能很快解决你的问题,解决方案是:

(dataGridView_flaggedComments.DataSource as DataView).RowFilter =...

下次将断点添加到出现此类错误的位置。看看你有什么装箱类型,以及你试图取消装箱的类型。我也不建议像你那样使用as。最好这样做:

DataView dv = dataGridView_flaggedComments.DataSource as DataView;
if(dv == null)
    throw new Exception("Bad Data Source type");
else
{
    //use dv here
}

As from your code:dataGridView_flaggedComments.DataSource = query.AsDataView();

所以当你试图调用这个:(dataGridView_flaggedComments.DataSource as DataTable)时,你会得到null,因为你的DataSource不是DataTable,而是DataView

看起来您应该使用类似(dataGridView_flaggedComments.DataSource as DataView).RowFilter的东西。