"Ссылка на объект не установлена в экземпляр объекта" при фильтрации данныхGridView

У меня есть эта функция поиска, чтобы отмечать комментарии из базы данных MySQL, которые соответствуют списку ключевых слов, отмеченные комментарии будут отображаться в 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; } } }
}
</string>

Затем, если я comboBox_stockIndex символ из 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 - мое последнее средство. Любая помощь будет очень высоко оценена! Большое спасибо!

2 ответа

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
}


Как из вашего кода: dataGridView_flaggedComments.DataSource = query.AsDataView();

Поэтому, когда вы пытаетесь вызвать это: (dataGridView_flaggedComments.DataSource as DataTable) вы получите null, потому что ваш DataSource не является DataTable а DataView.

Похоже, вы должны использовать что-то вроде (dataGridView_flaggedComments.DataSource as DataView).RowFilter.

licensed under cc by-sa 3.0 with attribution.