【发布时间】:2020-07-21 06:39:03
【问题描述】:
我在 Windows 窗体的 VSTO Outlook 插件中使用 DataGridView。我将 .csv 中的数据实现到网格中。现在我想过滤数据适合文本框。我有一个代码:
private void button1_Click_1(object sender, EventArgs e)
{
foreach (Form1 frm in System.Windows.Forms.Application.OpenForms)
{
BindingSource bs = new BindingSource();
bs.DataSource = frm.DataGrid.DataSource;
bs.Filter = DataGrid.Columns[0].HeaderText.ToString() + " LIKE '%" + searchtextBox.Text + "%'";
DataGrid.DataSource = bs;
// File.AppendAllText(@"C:\install\CSharp\tulemus.txt", $"The grid is: {frm.DataGrid.DataSource}" + Environment.NewLine); checking the source and it is null. Why?
}
}
问题是
frm.DataGrid.DataSource
不接受数据网格值。我不明白我应该如何获取数据源。每次我从带有 foreach sicle 的 csv 文件启动时,我的 DataGrid 都会获取值。
添加信息。我正在实现来自 csv 制作列表的数据,如下所示:
foreach (Form1 frm in System.Windows.Forms.Application.OpenForms)
{
var csvTable = new DataTable();
using (var csvReader = new CsvReader(new StreamReader(System.IO.File.OpenRead($@"{AppdtataMallid}\{selectedFile}")), true))
{
csvTable.Load(csvReader);
}
List<SearchParameters> searchParameters = new List<SearchParameters>();
for (int i = 0; i < csvTable.Rows.Count; i++)
{
searchParameters.Add(new SearchParameters { Eesnimi = csvTable.Rows[i][0].ToString(), Perenimi = csvTable.Rows[i][1].ToString(), Isikukood = csvTable.Rows[i][2].ToString() });
}
foreach (var searchparameter in searchParameters)
{
DataGridViewRow row = (DataGridViewRow)frm.DataGrid.Rows[j].Clone();
row.Cells[0].Value = j+1;
row.Cells[1].Value = searchparameter.Eesnimi;
row.Cells[1].Value += " ";
row.Cells[1].Value += searchparameter.Perenimi;
row.Cells[2].Value = searchparameter.Isikukood;
frm.DataGrid.Rows.Add(row);
j++;
}
}
我想出了如何做到这一点。也许这不是最快的方式,但它是:
foreach (Form1 frm in System.Windows.Forms.Application.OpenForms)
{
CurrencyManager currencyManager = (CurrencyManager)BindingContext[frm.DataGrid.DataSource];
currencyManager.SuspendBinding();
// Show all lines
for (int u = 0; u < frm.DataGrid.RowCount; u++)
{
frm.DataGrid.Rows[u].Visible = true;
}
// Hide the ones that you want with the filter you want.
for (int u = 0; u < frm.DataGrid.RowCount; u++)
{
if (frm.DataGrid.Rows[u].Cells[0].Value.ToString().ToUpper().Contains(frm.searchtextBox.Text.ToString().ToUpper()))
{
frm.DataGrid.Rows[u].Visible = true;
}
else
{
frm.DataGrid.Rows[u].Visible = false;
}
}
// Resume data grid view binding
currencyManager.ResumeBinding();
}
是的,它正在工作,因为我按照下面的建议更改了一些逻辑。
List<SearchParameters> searchParameters = new List<SearchParameters>();
for (int i = 0; i < csvTable.Rows.Count; i++)
{
searchParameters.Add(new SearchParameters { Nimi = csvTable.Rows[i][0].ToString() + " " + csvTable.Rows[i][1].ToString(), Isikukood = csvTable.Rows[i][2].ToString(), Büroo = csvTable.Rows[i][3].ToString() });
}
frm.DataGrid.DataSource = searchParameters;
【问题讨论】:
-
您将不得不提供更多信息。您的评论……“我将 .csv 中的数据实现到网格中。”……“你是如何做到的?”您是否手动设置了每个单元格,创建了
DataTable或List<T>并将其用作数据源? -
代码“暗示”网格有一个
DataSource…bs.DataSource = frm.DataGrid.DataSource;…但是,除非有一个“全局”变量保存“原始”数据源,否则代码将“丢失” ” 这个数据在线……DataGrid.DataSource = bs;……这在应用过滤器后有效地“失去”了与原始数据的任何连接。这意味着每次应用过滤器时都需要重新读取 csv。 -
你好。我更新了我的帖子。我正在制作列表,然后设置每个单元格。所以据我所知,我不能使用我的 Datagrid 中的数据,我需要像我最初从 CSV 一样制作新列表并使用它?我会尝试这样做。
-
代码似乎将数据“手动”逐个单元格地添加到网格中。因此,网格不使用/没有
DataSource。因此,过滤器代码中的行…bs.DataSource = frm.DataGrid.DataSource;将返回“空”或 null,因为从未设置网格数据源。在……之后网格为空也就不足为奇了。DataGrid.DataSource = bs;。我建议对将网格数据源设置为DataTable之类的东西进行一些研究。手动添加数据会使排序更加困难。 -
您的解决方案将起作用,但是,如果网格有
DataSource,则有更简单的方法可以做到这一点。在您的解决方案中,我质疑CurrencyManager的使用,因为它似乎什么也没做!如前所述,这行…CurrencyManager currencyManager = (CurrencyManager)BindingContext[frm.DataGrid.DataSource];…将为空或空,因为frm.DataGrid.DataSource为空或空,因为您尚未设置网格DataSource。
标签: c# datagridview outlook vsto