以编程方式将新列添加到datagridview(datagridview填充了datatable)

h4cxqtbf  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(297)

我已将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++;
            }
        }

但是当我运行程序时,序列号列是空的。此列必须显示数字,如1、2、3。。对于gridview中的行。
现在我更改了添加新列的代码。我尝试下面的代码

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++;
            }

这会生成序列号,但会根据数据表的顺序将记录行插入其中。

xtfmy6hx

xtfmy6hx1#

我还不清楚你想要什么。我将从图片中假设您希望列“srno”具有数字1、2、3…等…而不是“预排序”索引顺序。这是可行的;然而,与在数据源中设置单元格值相比,在“网格”中设置单元格值似乎有一些混淆。
例如,查看代码的第一个代码段
DataTable dTable 从数据库。然后代码向网格中添加一列。然后将数据源设置为网格。然后对网格进行排序。最后,通过网格中所有行的循环来设置 SrNo 价值观。这是直截了当的,从我的测试来看…这应该管用。您声明该列为空,但是在我的测试中,该代码在“srno”列中与预期的1、2、3…一起工作。现在还不清楚这个代码是在哪里被调用的,所以我可以断定在这个代码被调用之后还有其他事情发生。
正如其他人所评论的,把这个专栏放到
DataSource DataTable 它自己。这是可行的,但是,您使用的方法有一个问题…您需要在添加“srno”编号之前先对数据表进行排序,而我们添加“srno”列的表无法排序。因此,您需要从“排序”表中获得一个“新”表。
不清楚为什么在最初查询数据库时不执行所有这些操作,但是下面是我上面描述的一个示例。
首先让我们看看“为什么”我们不能用“预”排序 DataTable 把数字加在一起。首先,我们得到一个数据表。然后对数据表进行排序,然后将其用作网格的数据源。如果我们将新列添加到网格中,那么…这就可以了。但是,如果我们将列添加到 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()是将列添加到网格中的第一段代码,它按预期工作。

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;
}

希望这有道理。

相关问题