DataView RowFilter不会过滤DataGridView上的行

时间:2014-11-03 00:16:12

标签: c# datagridview datatable dataview rowfilter

我有此功能button_Search1_Click来搜索与关键字匹配的评论,然后在dataGridView_flaggedComments中显示这些标记的评论。

接下来,如果comboBox_stockIndex上有任何更改,我希望过滤器发生,即使用dataGridView_flaggedComments Tickers_Ticker_ID过滤1中带标记的评论}}。但是当我这样做时,所有评论(无论是否标记)都属于我Tickers_Ticker_ID 1 dataGridView_flaggedComments的{​​{1}}。它应该只显示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 个答案:

答案 0 :(得分:2)

DataView本身并非持有任何数据。

当您设置过滤器时,您正在通过新过滤器(LinqDataView)有效地替换Where中的原始过滤器,即RowFilter子句。

您需要连接它们以创建双重条件。

由于您的Where子句使用复杂RegEx,我认为最简单的方法是重复使用它,并使用新的简单'Tickers_Ticker_ID = ' + id条件附加它。

如果您不想重新应用原始过滤器,则可能需要将过滤后的行存储在临时表中。这里我有一个DataSet DS并首先克隆第一个表的结构,命名新表并将其添加到DataSet。在适当的时候,我从查询中复制过滤后的行:

设置临时表,在其中设置其他数据库内容:

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;
 }

答案 1 :(得分:0)

你的过滤错误了......试试这个......

  dv.RowFilter = "Tickers_Ticker_ID = 1";