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