You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过按钮点击向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()方法的局部变量,改为窗体类的成员变量,让整个类的所有方法(包括按钮点击事件)都能访问它。

修改步骤:

  1. 在窗体类顶部声明DataTable变量:
private DataTable dt; // 类级别成员变量
  1. 修改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;
}
  1. 在按钮点击事件中直接调用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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:56:04