我有此功能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;
}
}
答案 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";