【问题标题】:C# WinForms DataGridView Filter error column not foundC# WinForms DataGridView 过滤器错误列未找到
【发布时间】:2021-03-26 02:40:09
【问题描述】:

我已使用以下代码在表单加载时使用 html 表填充了 datagridview1

private void Form1_Load(object sender, EventArgs e)
        {
            WebClient webClient = new WebClient();
            string page = webClient.DownloadString(@"C:\data.htm");

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(page);
            List<List<string>> table = doc.DocumentNode.SelectSingleNode("//table")
                        .Descendants("tr")
                        .Where(tr => tr.Elements("td").Count() == 19)
                        .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                        .ToList();
            dataGridView1.ColumnCount = table[0].Count;
            int x = 0;
            foreach (var item in table[0])
            {
                dataGridView1.Columns[x].Name = item.Replace("&nbsp;", "");
                x++;
            }
            table.RemoveAt(0);
            foreach (var item in table)
            {
                string[] s = item.ToArray();
                for (int i = 0; i < s.Length; i++)
                    s[i] = s[i].Replace("&nbsp;","");
                dataGridView1.Rows.Add(s);
            }
            dataGridView1.Columns[1].Name = "Material";
            button1.Enabled = false;
        }

在表单中,我有一个 ComboBox,其中选择了一个值,按下按钮我有以下代码根据所选值过滤 datagridview1

private void button1_Click(object sender, EventArgs e)
    {
        int SelectedIndex = combobox1.SelectedIndex;
        combobox1.SelectedItem.ToString();
        string SelectedValue = (string)combobox1.Items[SelectedIndex];

        //DataTable data = (DataTable)(dataGridView1.DataSource);
        //DataView dvContentDatabase = new DataView(data)
        //{
        //    RowFilter = string.Format("'%{0}%' LIKE '%{1}%'", "Material", "A2B3")
        //};
        //dataGridView1.DataSource = dvContentDatabase;

        //this.dataGridView1.Rows.OfType<DataGridViewRow>().Where(r => r.Cells["Material"].Value.ToString() == SelectedValue).ToList().ForEach(row => { if (!row.IsNewRow) row.Visible = false; });

        BindingSource bs = new BindingSource();
        bs.DataSource = dataGridView1.DataSource;

        bs.Filter = dataGridView1.Columns[1].HeaderText.ToString() + " LIKE '%" + SelectedValue + "%'";
        dataGridView1.DataSource = bs;
    }

我尝试了几种我在上面的代码中注释过的方法,但是 DataGrid 视图返回一个空白行。我已更改数据以完全匹配所选的测试值,但仍然没有运气。 我已经手动在过滤器中输入了值,而不是使用 selectedvalue 仍然返回一个空白行。 非常感谢任何帮助。

更新代码 - 数据表作为 datagridview 数据源 正如@JohnG 所指出的,更改了数据源,仍然没有运气

        private void Form1_Load(object sender, EventArgs e)
    {
        WebClient webClient = new WebClient();
        string page = webClient.DownloadString(@"C:\Users\drr\Documents\Excel\TBE.htm");

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(page);
        List<List<string>> table = doc.DocumentNode.SelectSingleNode("//table")
                    .Descendants("tr")
                    .Where(tr => tr.Elements("td").Count() == 19)
                    .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                    .ToList();
        int columns = 0;
        DataTable mydt = new DataTable();
        foreach (var item in table[0])
        {
            mydt.Columns.Add(item.Replace("&nbsp;", ""));
            columns++;
        }
        table.RemoveAt(0);
        foreach (var item in table)
        {
            string[] s = item.ToArray();
            for (int i = 0; i < s.Length; i++)
                s[i] = s[i].Replace("&nbsp;", "");
            mydt.Rows.Add(s);
        }
        dataGridView1.DataSource = mydt;
        dataGridView1.Columns[1].Name = "Material";
        button1.Enabled = false;
    }

【问题讨论】:

  • 我不确定这两个代码 sn-ps 是否匹配。在第一个代码 sn-p 中,看起来代码是“手动”将行直接添加到网格中...dataGridView1.Rows.Add(s); ...然后在第二个代码 sn-p 中,代码似乎抓取了网格DataSource? ...bs.DataSource = dataGridView1.DataSource; ...在所有代码中,我看不到datagridView1DataSouce 的设置位置。有了这个我会假设过滤器没有产生任何东西,因为数据源是空的。
  • @rellik,你能举一个相关html的例子吗?它可以帮助我做一个测试。
  • @JohnG 感谢您指出这一点,我会将数据放入数据表并将其用作 datagridview 的数据源。很快就会告诉你结果如何。
  • 嗨@jack-j-jun-msft 抱歉,我没有时间更改数据,因为表中有专有信息。但我设法找到了我在下面发布的解决方案。感谢您的帮助。

标签: c# visual-studio winforms linq


【解决方案1】:
private void Form1_Load(object sender, EventArgs e)
    {
        WebClient webClient = new WebClient();
        string page = webClient.DownloadString(@"C:\Users\drr\Documents\Excel\TBE.htm");

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(page);
        List<List<string>> table = doc.DocumentNode.SelectSingleNode("//table")
                    .Descendants("tr")
                    .Where(tr => tr.Elements("td").Count() == 19)
                    .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList())
                    .ToList();
        int columns = 0;
        DataTable mydt = new DataTable();
        foreach (var item in table[0])
        {
            string ColumnNames = (item.Replace("&nbsp;", ""));
            mydt.Columns.Add(item.Replace(ColumnNames.ToString(), ""));
            mydt.Columns[columns].ColumnName = ColumnNames.ToString();
            mydt.AcceptChanges();
            columns++;
        }
        table.RemoveAt(0);
        foreach (var item in table)
        {
            string[] s = item.ToArray();
            for (int i = 0; i < s.Length; i++)
                s[i] = s[i].Replace("&nbsp;", "");
            mydt.Rows.Add(s);
        }
        DGV_SAPData.DataSource = mydt;
        DGV_SAPData.Columns[1].Name = "Material";
        BTN_Print.Enabled = false;
    }

感谢@JohnG 为我指明了正确的方向,当然可能有更简单或更简单的方法,如果您找到其他解决方案,请分享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多