2014-10-28 37 views
2

我有這個搜索功能,爲了標記來自MySQL數據庫的匹配關鍵字列表的評論,標記的評論將顯示在dataGridView_flaggedComments上,然後關注通過填入comboBox_stockIndex與涉及的股價符號(例如BARC,LLOY,TSCO)。「對象引用未設置爲對象的實例」時過濾dataGridView

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_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是我的最後一招。任何幫助將非常感謝!非常感謝你!

回答

3

DataView不是DataTable

在這裏,你設置DataSoureDataView

dataGridView_flaggedComments.DataSource = query.AsDataView(); 

在這裏,您鑄造它作爲DataTable

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

所以,如果我inderstood很快你的問題,解決辦法是:

(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 
} 
+0

好吧,我不能相信這只是'DataView'和'DataTable'的問題! T.T現在可以使用!非常感謝你!! :D – Shyuan 2014-10-28 13:00:04

+0

我不能相信你花了2天的時間:) – Reniuz 2014-10-28 13:11:13

+0

我也是.. :(另外,這是因爲編程不是我學到的東西,而是我爲我的項目做了部分工作:/ – Shyuan 2014-10-28 13:20:19

2

從您的代碼:dataGridView_flaggedComments.DataSource = query.AsDataView();

所以,當你試圖調用此:(dataGridView_flaggedComments.DataSource as DataTable)你會得到null,因爲你的DataSource不是DataTableDataView

它看起來像你應該使用類似(dataGridView_flaggedComments.DataSource as DataView).RowFilter來代替。

相關問題