【问题标题】:Cant get data from Windows forms DataGridView C#无法从 Windows 窗体 DataGridView C# 获取数据
【发布时间】: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 中的数据实现到网格中。”……“你是如何做到的?”您是否手动设置了每个单元格,创建了 DataTableList&lt;T&gt; 并将其用作数据源?
  • 代码“暗示”网格有一个DataSourcebs.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


【解决方案1】:

您可以将DataTable table 对象添加为私有字段。绑定到此table 对象的所有数据。将您的 frm.DataGrid.DataSource 替换为 table

frm.DataGrid 看起来像 ASP.NET Webform 的 GridView。回发到点击事件(或其他事件)时,无法加载其数据源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多