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:チェックボックスがクリックされたときに2番目のdatagridviewrow(dgvr)がまだnullとして表示されているようです。そのため、ここでエラーが発生しています。