以编程方式将新列添加到 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)的主要内容,如果未能解决你的问题,请参考以下文章

如何将新列添加到按 groupby 分组的分层数据框中

EntityFrameworkCore - 将新列添加到联接表

将新列添加到 wordpress 数据库

将新列添加到 Oracle 表后生成主键值

如何将新列添加到权限表

需要使用 xsl 将新添加的条目添加到给定 xml 的新列