2014-11-03 4 views
-1

У меня есть эта функция button_Search1_Click для поиска комментариев, которые соответствуют ключевым словам, а затем отображать эти помеченные комментарии в dataGridView_flaggedComments.DataView RowFilter не фильтрует строки на DataGridView

Далее, если есть какие-либо изменения на comboBox_stockIndex, я хочу, чтобы фильтр иметь место то есть фильтровать помеченных комментарии в dataGridView_flaggedComments с Tickers_Ticker_ID из 1. Но когда я это делаю, все комментарии (независимо от того, помечены или нет) относятся к Tickers_Ticker_ID из 1 на моем dataGridView_flaggedComments. Он должен показывать только отмеченные комментарии для Tickers_Ticker_ID из 1, не все комментарии.

Я думаю, что что-то не так с DataSource, но я не мог понять это. Любая помощь будет очень высоко оценена! Спасибо!

(Если бы я скучал любые подобные вопросы, пожалуйста, указать на это. Большое спасибо!)

private void button_Search1_Click(object sender, EventArgs e) 
{ 
    commentCount = 0; 
    richTextBox_flaggedComments.Clear(); 
    dataGridView_flaggedComments.Refresh(); 
    DataTable flaggedcomments = new DataTable("flaggedcomments"); 
    using (MySqlConnection sqlConn = new MySqlConnection(strProvider)) 
    { 
     using (MySqlDataAdapter da = new MySqlDataAdapter(
     "SELECT Comment_ID, Comments_Date, Author, Title, Comments_Comment, " + 
       " Tickers_Ticker_ID FROM comments ORDER BY Comments_Date 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(); 
} 


private void comboBox_stockIndex_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    DataView dv = dataGridView_flaggedComments.DataSource as DataView; 
    if (dv == null) 
     throw new Exception("Bad Data Source type"); 
    else 
    { 
     dv.RowFilter = string.Format("Tickers_Ticker_ID = '1'"); 
     dataGridView_flaggedComments.DataSource = dv; 
    } 
} 

ответ

2

A DataView как таковой не удержать любые данные.

При установке фильтра вы эффективны заменяющим Orginal фильтра в вашем LinqDataView, то есть пункт Where, новый фильтр, то есть по RowFilter.

Вам необходимо объединить их, чтобы создать двойное условие.

С вашего пунктом Where использует сложный RegEx Я думаю, самый простой способ будет повторно использовать его, добавив его с новым, простым 'Tickers_Ticker_ID = ' + id состояния.

Если вы не хотите повторно использовать исходный фильтр, вы можете захотеть сохранить отфильтрованные строки во временной таблице. Здесь у меня есть DataSet DS и сначала клонируйте структуру 1-й таблицы, назовите новую таблицу и добавьте ее в DataSet. При необходимости скопировать отфильтрованные строки над из запроса:

заносит в таблице Temp, где вы установили вас другие DB материал:

DataSet DS;        // if you don't already have one.. 
             // put it at class level! 

DS = new DataSet();      // ..create it 
DataTable DT = DS.Tables[0].Clone(); // the temp table has the sdame structure 
DT.TableName = "temp";     // is called by a name 
DS.Tables.Add(DT);      // and (optionally) added to the DataSet. 

Когда вы делаете поиск загружаемых данных в темп таблица:

DS.Tables["temp"].Rows.Clear(); 
query.CopyToDataTable(DS.Tables["temp"], LoadOption.OverwriteChanges); 
DGV.DataSource = DS.Tables["temp"]; 

Теперь вы можете использовать его в combo_filter_SelectedIndexChanged событие:

string id = ddl_filter.Text; 
if (id == "") DGV.DataSource = DS.Tables["temp"]; 
else 
{ 
    DataView dv = new DataView(DS.Tables["temp"]) 
    dv.RowFilter = string.Format("id = " + id) ; 
    DGV.DataSource = dv; 
} 
+0

Привет, TaW, я обычно делал то, что вы сказали, повторите. Но я не хочу, чтобы это напоминало повторяющееся одно и то же, поэтому я пытаюсь «очистить» код. Невозможно ли исправить мой код? Например. вместо использования 'DataView', которые не содержат данных, может быть, я могу использовать что-то еще, чтобы он удерживал/запоминал текущие представленные данные в DGV? Любые советы будут высоко ценится. Спасибо! – Shyuan

+0

Ну, либо вы делаете некоторую фильтрацию в коде несколько раз, либо сохраняете отфильтрованные данные в темном хранилище.DataTable - довольно очевидный выбор памяти imo, см. Обновленный ответ. – TaW

+0

Привет, TaW, спасибо вам за руководство, мой вопрос может быть глупым, следует ли положить первую часть вашего кода в 'button_Search1_Click' или в новом классе ? Если я ставлю под 'button_Search1_Click', то я не смог бы получить доступ к' DS' в 'combo_filter_SelectedIndexChanged' из' button_Search1_Click', правильно? Кроме того, 'DataSet DS = новый DataSet();' отсутствует в коде? Спасибо за помощь! – Shyuan

0

Ваша фильтрация неправильно ... попробуйте это вместо того, чтобы ...

dv.RowFilter = "Tickers_Ticker_ID = 1"; 
+0

Привет, это не помогая .. – Shyuan

+0

Затем установите точку останова на том месте, где вы установили Dataview, и убедитесь, что это что-то ... – Codexer