【问题标题】:"Object reference not set to an instance of an object" when filtering dataGridView过滤dataGridView时“对象引用未设置为对象的实例”
【发布时间】:2014-12-23 21:17:51
【问题描述】:

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

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 以仅显示与所选符号相关的 cmets(一旦选择符号,它将查找该符号的 Tickers_TTicker_ID,然后过滤Tickers_Ticker_ID)。但是下面的代码不起作用。出现错误提示“对象引用未设置为对象的实例”。对于这条线(dataGridView_flaggedComments.DataSource as DataTable).DefaultView.RowFilter = string.Format("Tickers_Ticker_ID = '{0}'", da["Ticker_ID"]);。我尝试调试,但我不明白出了什么问题。

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 是我最后的选择。任何帮助将不胜感激!非常感谢!

【问题讨论】:

    标签: c# datagridview filtering


    【解决方案1】:

    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
    }
    

    【讨论】:

    • 好吧,我不敢相信这只是DataViewDataTable 的问题!! T.T 现在可以了!!非常感谢!! :D
    • 我不敢相信你花了 2 天时间 :)
    • 我也是.. :( 另外,这是因为编程不是我学习的,我这样做只是为了我的项目的一部分:/
    • 嗨 Reniuz,我的代码有问题,它实际上没有过滤 datagridview_flaggedcomments 中的数据,我相信我的代码从数据库中挖掘出与特定符号相关的所有 cmets。不确定您是否可以在那里看到问题?
    【解决方案2】:

    来自您的代码:dataGridView_flaggedComments.DataSource = query.AsDataView();

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

    看来您应该改用 (dataGridView_flaggedComments.DataSource as DataView).RowFilter 之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多