我有一个从 CSV 文件填充的数据表,然后使用 DataGridView 在内存中编辑数据。据我了解,数据的编程编辑应该在用户编辑通过的 DataTable 上完成。 DataGridView。
但是,当我以编程方式将列添加到 DataTable 时,它不会自动反射(reflect)在 DataGridView 中,我怀疑反之亦然。
如何保持两者并发?我认为数据绑定(bind)的想法是这是自动的......
也可以添加行。
已解决:
AutoGeneratedColumns
在设计器代码中设置为 false
,尽管在属性对话框中为 true
(并在代码中明确设置)。最初的列是以编程方式生成的,因此不应该出现,但是由于设计器代码还继续生成最初用于调试的“设计于”列,因此没有被采纳。
道德:检查自动生成的代码!
最佳答案
这听起来不对。为了对其进行测试,我编写了一个简单的应用程序,它创建了一个 DataTable 并向其中添加了一些数据。
在 button1.Click
上,它将表格绑定(bind)到 DataGridView。
然后,我添加了第二个按钮,单击该按钮时,会向基础 DataTable 添加另一列。
当我测试它并单击第二个按钮时,网格立即反射(reflect)了更新。
为了测试相反的情况,我添加了第三个按钮,它会弹出一个对话框,其中包含绑定(bind)到同一个 DataTable 的 DataGridView。然后在运行时,我向第一个 DataGridView 添加了一些值,当我单击按钮调出对话框时,更改会反射(reflect)出来。
我的观点是,它们应该保持并发。当 Mark 建议您检查 AutoGenerateColumns
是否设置为 true
时,Mark 可能是对的。不过,您不需要调用 DataBind,这仅适用于 Web 上的 DataGridView。也许您可以发布您正在做的事情,因为这应该有效。
我是如何测试它的:
DataTable table = new DataTable();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
table.Columns.Add("Name");
table.Columns.Add("Age", typeof(int));
table.Rows.Add("Alex", 26);
table.Rows.Add("Jim", 36);
table.Rows.Add("Bob", 34);
table.Rows.Add("Mike", 47);
table.Rows.Add("Joe", 61);
this.dataGridView1.DataSource = table;
}
private void button2_Click(object sender, EventArgs e)
{
table.Columns.Add("Height", typeof(int));
foreach (DataRow row in table.Rows)
{
row["Height"] = 100;
}
}
private void button3_Click(object sender, EventArgs e)
{
GridViewer g = new GridViewer { DataSource = table };
g.ShowDialog();
}
public partial class GridViewer : Form //just has a DataGridView on it
{
public GridViewer()
{
InitializeComponent();
}
public object DataSource
{
get { return this.dataGridView1.DataSource; }
set { this.dataGridView1.DataSource = value; }
}
}
关于c# - 将列添加到绑定(bind)到 DataGridView 的 DataTable 不会更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489425/