【问题标题】:DataView RowFilter doesn't filter the Rows on DataGridViewDataView RowFilter 不过滤 DataGridView 上的行
【发布时间】:2014-11-03 00:16:11
【问题描述】:

我有这个函数button_Search1_Click来搜索匹配关键字的cmets,然后在dataGridView_flaggedComments中显示这些标记的cmets。

接下来,如果comboBox_stockIndex 有任何更改,我希望进行过滤,即使用1Tickers_Ticker_ID 过滤dataGridView_flaggedComments 中标记的cmets。但是,当我这样做时,所有 cmets(无论是否标记)都属于 Tickers_Ticker_ID1 显示在我的 dataGridView_flaggedComments 上。它应该只显示标记为 Tickers_Ticker_ID1 的 cmets,而不是所有 cmets。

我认为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;
    }
}

【问题讨论】:

    标签: c# datagridview datatable dataview rowfilter


    【解决方案1】:

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

    【讨论】:

    • 嗨,TaW,我曾经像你说的那样做,即重复使用它。但我不希望它有点像重复同样的事情,因此我试图“清理”代码。有没有办法修复我的代码?例如。而不是使用不保存数据的DataView,也许我可以使用其他东西来保存/记住 DGV 上当前表示的数据?任何建议将不胜感激。谢谢!
    • 你要么在代码中反复进行一些过滤,要么将过滤后的数据保存在临时存储中。 DataTable 是一个相当明显的存储选择 imo,请参阅更新的答案..
    • 嗨,TaW,谢谢你的指导,我的问题可能很愚蠢,我应该把你的代码的第一部分放到button_Search1_Click 还是一个新的类中?如果我放在button_Search1_Click 下,那么我无法从button_Search1_Click 访问combo_filter_SelectedIndexChanged 中的DS,对吧?此外,代码中是否缺少DataSet DS = new DataSet();?感谢您的帮助!
    • 将数据集移动到类级别! (这就是我插入空行的原因)
    • 当然,因为当您到达该行时,DataSet 中还没有 Table。您需要使用您必须创建克隆的表;如果它不在 DS 中,只需使用它:DataTable DT = yourTable.Clone(); 我认为它是flaggedcomments。顺便说一句,这也仅在本地定义;您可能还需要将其移动到调用级别..
    【解决方案2】:

    您的过滤错误...试试这个...

      dv.RowFilter = "Tickers_Ticker_ID = 1";
    

    【讨论】:

    • 然后在你设置 Dataview 的地方设置一个断点,并确保它是什么...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多