以编程方式将新列添加到 DataGridView(填充有 DataTable 的 DataGridview)
Posted
技术标签:
【中文标题】以编程方式将新列添加到 DataGridView(填充有 DataTable 的 DataGridview)【英文标题】:Add new column programmatically to DataGridView (DataGridview Filled with DataTable) 【发布时间】:2020-10-15 23:07:53 【问题描述】:我已将 datagridview 与 access 数据库表绑定。我想在程序加载时向 DataGridView 添加一个新的自定义列。此列包含数据表中行的自动递增编号“序列号”。代码如下,
using (var conn = new OleDbConnection(DatabaseObjects.ConnectionString))
conn.Open();
command = new OleDbCommand("SELECT s.RollNo, s.SName, s.FName, s.DOB, c.Class, s.[Section],s.Picture from students as s left outer join classes as c " +
"on c.ClassID = s.ClassID", conn);
dTable = new DataTable();
dTable.Load(command.ExecuteReader());
dgvDisplay.Columns.Add("SrNo", "Sr No"); // Adding "Serial No" Column to DataGridView
dgvDisplay.DataSource = dTable;
dgvDisplay.Sort(dgvDisplay.Columns["RollNo"], ListSortDirection.Ascending);
// Change Column Headings
dgvDisplay.Columns["RollNo"].HeaderText = "Roll No";
dgvDisplay.Columns["SName"].HeaderText = "Student Name";
dgvDisplay.Columns["FName"].HeaderText = "Father Name";
dgvDisplay.Columns["DOB"].HeaderText = "Date Of Birth";
// Serial Number code
int srNo = 1;
foreach(DataGridViewRow row in dgvDisplay.Rows)
row.Cells["SrNo"].Value = srNo;
srNo++;
但是当我运行程序时,序列号列是空的。此列必须在 gridview 中显示 1,2,3.. 之类的数字。
现在我更改了添加新列的代码。我在下面尝试这段代码
dTable.Columns.Add(new DataColumn("SrNo", typeof(Int32))); // Adding "Serial No" Column to DataTable
dgvDisplay.DataSource = dTable;
dgvDisplay.Sort(dgvDisplay.Columns["RollNo"], ListSortDirection.Ascending);
// Serial Number code
int srNo = 1;
foreach (DataRow row in dTable.Rows)
row["SrNo"] = srNo;
srNo++;
这会生成序列号,但会根据数据表的顺序插入记录行。
【问题讨论】:
就个人而言,我会将列添加到数据表中,用数据填充它,然后将其绑定到数据网格视图。 您可以尝试将数据源的分配 (dgvDisplay.DataSource = dTable
) 移到 Columns.Add 行上方。我认为当您分配数据源时,您添加的列可能会被覆盖。
我已将 DataSource 的分配移到新的 Column Add 行之前。但还是空的。
@Crowcoder 我该怎么做?将列添加到数据表
dTable.Columns.Add( < your choice of overloads >)
【参考方案1】:
我仍然不清楚你想要什么。我将从图片中假设您希望“SrNo”列具有数字 1、2、3……等等……而不是“预排序”索引顺序。这是可行的;但是,在“网格”中设置单元格值而不是在数据源中设置单元格值似乎存在一些混淆。
例如,查看第一个代码 sn -p 代码从数据库中获取DataTable
dTable
。然后代码将一列添加到 GRID。然后将数据源设置为网格。然后对 GRID 进行排序。最后,循环遍历 GRID 中的所有行以设置 SrNo
值。这是直截了当的,从我的测试来看……这应该有效。您声明该列是空的,但是在我的测试中,此代码在“SrNo”列中与 1、2、3 ......按预期工作。目前尚不清楚在何处调用此代码,因此我会得出结论,在此代码之后发生了其他事情被调用。
正如其他人评论的那样,将列放入DataSource
DataTable
本身可能会更好。这是可行的,但是,您使用的方法存在一个问题……您需要先对数据表进行排序,然后再添加“SrNo”数字,并且我们将“SrNo”列添加到的表无法排序。因此,您需要从“排序”表中获取“新”表。
不清楚为什么在最初查询数据库时不执行所有这些操作,但是,下面是我上面描述的示例。
首先让我们看看“为什么”我们不能使用“预”排序的DataTable
来添加数字。首先,我们得到一个数据表。然后对数据表进行排序,然后将其用作网格的数据源。如果我们将新列添加到 GRID,那么……这很好用。但是,如果我们将列添加到DataTable
并循环遍历数据表中的所有行,例如......
foreach (DataRow row in dTable.Rows)
row["SrNo"] = srNo;
srNo++;
这是行不通的,因为循环不会遍历“排序”顺序。这就是我之前说的意思。 “它不可能是一个排序表。”话虽如此,一个简单的解决方案似乎是获取一个已经排序的新表。然后将“SrNo”数字添加到该表中。
在下面的示例中,如果您注释掉该行……
dTable = dTable.DefaultView.ToTable();
您将看到项目未按正确顺序添加。
使用了全局DataTable
,但这是不必要的。
DataTable dTable;
public Form1()
InitializeComponent();
private void Form1_Load(object sender, EventArgs e)
//LoadDGV();
LoadDGV2();
LoadDGV() 是将列添加到 GRID 的第一个 sn-p 代码,它按预期工作。
private void LoadDGV()
dTable = GetTable();
dgvDisplay.Columns.Add("SrNo", "Sr No"); // Adding "Serial No" Column to DataGridView
dgvDisplay.DataSource = dTable;
dgvDisplay.Sort(dgvDisplay.Columns["ID"], ListSortDirection.Ascending);
int srNo = 1;
foreach (DataGridViewRow row in dgvDisplay.Rows)
row.Cells["SrNo"].Value = srNo++;
LoadDGV2() 将列添加到数据表中。使其工作的关键代码行是……dTable = dTable.DefaultView.ToTable();
private void LoadDGV2()
dTable = GetTable();
dTable.DefaultView.Sort = "ID";
dTable = dTable.DefaultView.ToTable();
dTable.Columns.Add(new DataColumn("SrNo", typeof(Int32))); // Adding "Serial No" Column to DataTable
int srNo = 1;
foreach (DataRow row in dTable.Rows)
row["SrNo"] = srNo++;
dgvDisplay.DataSource = dTable;
获取一些测试数据以完成示例的方法。
private DataTable GetTable()
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
Random rand = new Random();
for (int i = 0; i < 20; i++)
dt.Rows.Add(rand.Next(1, 200), "Name_" + i);
return dt;
希望这是有道理的。
【讨论】:
你问过你在哪里调用了这个代码。我在 FORM_Load() 方法中调用了这段代码。 我试过你的LoadDGV()代码。它在程序运行时显示 SrNo 列,但该列的所有单元格都是空的。 我试过你的 LoadDGV2() 代码。这对我有用。它显示 SrNo 和单元格填充了值。 我只能建议你创建一个“新”winforms 项目,将DataGridView
拖放到表单上并复制LoadDGV()
代码并从表单加载事件中调用它。我已经多次测试了代码,它按预期工作。正如我之前所说,如果它对您不起作用,则必须有其他事情发生。如果您在“新”项目中尝试代码并且它可以正常工作(应该如此),那么这将验证您当前代码中是否正在发生其他事情。以上是关于以编程方式将新列添加到 DataGridView(填充有 DataTable 的 DataGridview)的主要内容,如果未能解决你的问题,请参考以下文章