【发布时间】: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(" ", "");
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(" ","");
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(" ", ""));
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(" ", "");
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;...在所有代码中,我看不到datagridView1的DataSouce的设置位置。有了这个我会假设过滤器没有产生任何东西,因为数据源是空的。 -
@rellik,你能举一个相关html的例子吗?它可以帮助我做一个测试。
-
@JohnG 感谢您指出这一点,我会将数据放入数据表并将其用作 datagridview 的数据源。很快就会告诉你结果如何。
-
嗨@jack-j-jun-msft 抱歉,我没有时间更改数据,因为表中有专有信息。但我设法找到了我在下面发布的解决方案。感谢您的帮助。
标签: c# visual-studio winforms linq