如何通过按钮点击向DataTable添加行?解决dt未识别问题
解决DataTable在按钮点击事件中无法访问的问题
问题描述
原本直接通过DataGridView.Rows.Add添加行,现在改为用DataTable作为DataGridView的数据源,但在按钮点击事件中调用dt.Rows.Add时,程序无法识别dt对象——原因是dt是table()方法内部的局部变量,仅在该方法内有效。
初始化DataTable的代码如下:
private void table() { //create a data set DataSet ds = new DataSet(); //create a data table for the data set DataTable dt = new DataTable(); //create some columns for the datatable DataColumn dc = new DataColumn("Name"); DataColumn dc2 = new DataColumn("Entry"); DataColumn dc3 = new DataColumn("SL"); DataColumn dc4 = new DataColumn("SL%"); DataColumn dc5 = new DataColumn("TP"); DataColumn dc6 = new DataColumn("TP%"); DataColumn dc7 = new DataColumn("Position"); DataColumn dc8 = new DataColumn("Day"); DataColumn dc9 = new DataColumn("Notes"); //add the columns to the datatable dt.Columns.Add(dc); dt.Columns.Add(dc2); dt.Columns.Add(dc3); dt.Columns.Add(dc4); dt.Columns.Add(dc5); dt.Columns.Add(dc6); dt.Columns.Add(dc7); dt.Columns.Add(dc8); dt.Columns.Add(dc9); //add the datatable to the datasource ds.Tables.Add(dt); //make this data the datasource of our gridview dataGridView1.DataSource = ds.Tables[0]; dataGridView1.AutoSize = true; }
原本直接操作DataGridView添加行的代码:
dataGridView1.Rows.Add(name, EntryPrice.Text, StopPrice.Text, slper, ProfitPrice.Text, tpper, pos, day, NotesTB.Text);
解决方案
有两种实用方法可以解决该问题:
方法1:将DataTable声明为类成员变量
把dt从table()方法的局部变量,改为窗体类的成员变量,让整个类的所有方法(包括按钮点击事件)都能访问它。
修改步骤:
- 在窗体类顶部声明
DataTable变量:
private DataTable dt; // 类级别成员变量
- 修改
table()方法,去掉局部的DataTable dt声明,直接初始化成员变量:
private void table() { DataSet ds = new DataSet(); dt = new DataTable(); // 初始化类成员变量 // 列创建与添加代码保持不变 DataColumn dc = new DataColumn("Name"); DataColumn dc2 = new DataColumn("Entry"); // ... 其余列创建代码省略 dt.Columns.Add(dc); dt.Columns.Add(dc2); // ... 其余添加列代码省略 ds.Tables.Add(dt); dataGridView1.DataSource = ds.Tables[0]; dataGridView1.AutoSize = true; }
- 在按钮点击事件中直接调用
dt.Rows.Add:
private void btnAddRow_Click(object sender, EventArgs e) { dt.Rows.Add(name, EntryPrice.Text, StopPrice.Text, slper, ProfitPrice.Text, tpper, pos, day, NotesTB.Text); }
方法2:从DataGridView的数据源中获取DataTable
如果不想修改类结构,可以直接从dataGridView1.DataSource中取出绑定的DataTable,无需额外声明成员变量。
按钮点击事件代码修改为:
private void btnAddRow_Click(object sender, EventArgs e) { // 从数据源中获取DataTable DataTable dt = (DataTable)dataGridView1.DataSource; dt.Rows.Add(name, EntryPrice.Text, StopPrice.Text, slper, ProfitPrice.Text, tpper, pos, day, NotesTB.Text); }
如果数据源是DataSet中的表,也可以这样获取:
DataSet ds = (DataSet)dataGridView1.DataSource; DataTable dt = ds.Tables[0]; dt.Rows.Add(...);
说明
两种方法各有适用场景:
- 方法1适合需要频繁操作
DataTable的场景,访问更直接高效; - 方法2更灵活,无需维护额外的成员变量,适合偶尔操作的场景。
内容的提问来源于stack exchange,提问作者SA_
相关产品推荐
相关产品推荐

