CSV加载DataGridView后如何通过文本框向其中填充新增数据
问题核心原因
当DataGridView已绑定数据源时,不能直接通过Rows.Add方法新增行,也不能将DataSource赋值为控件本身,必须操作绑定的底层数据源(也就是你Readcsv方法返回的DataTable对象)。
修复步骤
- 首先在窗体类的全局范围定义一个DataTable变量,用来存储CSV加载的数据,保证多个按钮事件都能访问到该数据源:
// 写在窗体类内部、所有方法的外面 private DataTable _csvDataSource;
- 修改CSV加载按钮的逻辑,把读取到的DataTable赋值给全局变量后再绑定到DataGridView:
private void btnOtvor_Click(object sender, EventArgs e) { try { using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "CSV|*.csv", ValidateNames = true, Multiselect = false }) { if (ofd.ShowDialog() == DialogResult.OK) { // 把读取结果赋值给全局数据源 _csvDataSource = Readcsv(ofd.FileName); dataGridViewZamestnanci.DataSource = _csvDataSource; labelErrMsg.Text = "Subor otvoreny spravne"; labelErrMsg.ForeColor = System.Drawing.Color.Green; timer1.Start(); } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
- 修改新增按钮的逻辑,直接操作全局数据源新增行即可,DataGridView会自动同步数据:
private void btnPridat_Click(object sender, EventArgs e) { // 先校验是否已经加载了CSV数据 if(_csvDataSource == null) { MessageBox.Show("请先加载CSV文件", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } // 给底层DataTable新增一行数据 DataRow newRow = _csvDataSource.NewRow(); // 按你CSV的列顺序赋值即可 newRow[0] = textBoxMeno.Text; newRow[1] = textBoxTel.Text; newRow[2] = textBoxProfesia.Text; newRow[3] = textBoxTpp.Text; _csvDataSource.Rows.Add(newRow); }
原代码错误说明
- 原代码中
dataGridViewZamestnanci.DataSource = dataGridViewZamestnanci;属于逻辑错误,DataSource需要接收数据集合类对象(比如DataTable、List等),不能把控件本身赋值给它 - DataGridView绑定数据源后,控件层面的行集合是只读的,直接调用
Rows.Add会抛出异常,必须操作底层绑定的数据源
内容的提问来源于stack exchange,提问作者Dairy
相关产品推荐
相关产品推荐

