【发布时间】:2025-12-07 20:35:01
【问题描述】:
我正在设计一个带有包含 2 个选项卡的 TabControl 的 Windows 窗体。我在每个选项卡中都有一个 DataGridView,两者都填充了相同的列(包括 DataGridViewCheckBoxColumn),但参数不同,因此最终用户更容易使用它们,而不是全部包含在 1 个网格中。
我以为我可以为每个 DatagridView 设置一个 DataGridViewRow,并且它只会在调用时将它们用作新实例,但事实并非如此。
当用户选中或取消选中第一个选项卡的 DataGridView 中的复选框时,以下代码可以正常工作;
private void dgvChq_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
int column = e.ColumnIndex;
int row = e.RowIndex;
if (column == 5)
{
DataGridViewCheckBoxCell c = dgvChq[e.ColumnIndex, e.RowIndex] as DataGridViewCheckBoxCell;
if (c != null)
{
string a = e.FormattedValue.ToString();
if (a == "True")
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "UPDATE Customer.OrderHeader SET DateApproved = @approved WHERE OrderNumber = @ordNo";
cmd.Parameters.AddWithValue("@approved", DateTime.Today);
cmd.Parameters.AddWithValue("@ordNo",dgvChq.Rows[row].Cells[0].Value.ToString());
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
DataGridViewRow dr = dgvChq.SelectedRows[0];
dr.Cells[4].Value = DateTime.Today.ToString();
}
else
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "UPDATE Customer.OrderHeader SET DateApproved = NULL WHERE OrderNumber = @ordNo";
cmd.Parameters.AddWithValue("@ordNo", dgvChq.Rows[row].Cells[0].Value.ToString());
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
DataGridViewRow dr = dgvChq.SelectedRows[0];
dr.Cells[4].Value = "";
}
}
}
}
所以我想我可以使用不同的 DataGridViewRow 并将此代码重新用于另一个选项卡中的另一个 DataGridView,但它失败了;
private void dgvCredit_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
int column = e.ColumnIndex;
int row = e.RowIndex;
if (column == 0)
{
DataGridViewCheckBoxCell c = dgvCredit[e.ColumnIndex, e.RowIndex] as DataGridViewCheckBoxCell;
if (c != null)
{
string a = e.FormattedValue.ToString();
if (a == "True")
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "UPDATE Customer.OrderHeader SET DateApproved = @approved WHERE OrderNumber = @ordNo";
cmd.Parameters.AddWithValue("@approved", DateTime.Today);
cmd.Parameters.AddWithValue("@ordNo", dgvCredit.Rows[row].Cells[1].Value.ToString());
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
DataGridViewRow dgvr = dgvCredit.SelectedRows[0];
dgvr.Cells[4].Value = DateTime.Today.ToString();
}
else
{
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = "UPDATE Customer.OrderHeader SET DateApproved = NULL WHERE OrderNumber = @ordNo";
cmd.Parameters.AddWithValue("@ordNo", dgvCredit.Rows[row].Cells[1].Value.ToString());
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
DataGridViewRow dgvr = dgvCredit.SelectedRows[0];
dgvr.Cells[4].Value = "";
}
}
}
}
我在这里遗漏了什么,还是不能在同一个表单中使用多个 DataGridViewRows?
也许有一种更“动态”的方式我也可以这样做,这可能有助于解决我的问题?
PS:似乎第二个datagridviewrow(dgvr)在单击复选框时仍然显示为null,所以这是发生错误的地方。
【问题讨论】:
-
如果您复制并粘贴了数据网格,您是否有可能做到让它们都具有相同的事件处理程序?
-
你的代码急需重构和分离业务逻辑:( :(
-
而不是使用两个数据网格,是否可以根据文本框的文本简单地过滤一个?
-
可以使用多个datagridviewrows,但措辞不正确。此外,您现在面临的问题是什么?
-
@nawfal 在第二个数据网格中单击复选框时出现错误。我更新了我的问题以强调这一点。
标签: c# .net winforms datagridview