誰かがこれを手伝ってくれることを願っています。コードに修正できないバグがあります。DataGridViewコントロールでSelectedIndexイベント処理を使用してテストしています。
2つの列を作成しました:-
列0はDataGridViewTextBoxColum
列1はDataGridViewComboBoxColumn
&である2つの列で構成されるComboBox
小さなデータソースを列に指定しました。DataTable
Username
UserID
表示メンバーはユーザー名列に設定されており、ユーザーID列はValueMemberとして設定されています。
私が探しているのは、列0( )であり、のIndex Changedイベントに( )DataGridViewTextBox
を入力します。UserID
ValueMember
DataGridViewComboBoxColumn
プログラムを最初にロードしたときは正常に動作します。イベントはIndexChanged
エラーなしで発生します。しかしComboBox
、新しい行でを選択しようとすると、コンボボックスの値が前の行からクリアされ、Null参照例外がスローされます。
以下にコードをリストし、失敗するコードの行を強調表示しました:-
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
LoadData();
}
public OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Documents and Settings\riversd\Desktop\Test.accdb");
public string sql = "SELECT * FROM [AgentList]";
private void LoadData()
{
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
DataTable dt = AgentTable(sql, con);
DataGridViewTextBoxColumn textbox = new DataGridViewTextBoxColumn();
dataGridView1.Columns.Add(textbox);
DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
combo.DataSource = dt;
combo.DisplayMember = "agentName";
combo.ValueMember = "AgentID";
dataGridView1.Columns.Add(combo);
}
public DataTable AgentTable(string SQL, OleDbConnection con)
{
var AgentList = new DataTable();
var SELECTcommand = new OleDbCommand(SQL, con);
var adaptor = new OleDbDataAdapter();
adaptor.SelectCommand = SELECTcommand;
con.Open();
adaptor.SelectCommand.ExecuteNonQuery();
adaptor.Fill(AgentList);
con.Close();
return AgentList;
}
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
DataGridViewColumn col = dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex];
if (col is DataGridViewComboBoxColumn)
{
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dataGridView1.CurrentCell.ColumnIndex == 1 && e.Control is ComboBox)
{
ComboBox comboBox = e.Control as ComboBox;
comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged;
}
}
private void LastColumnComboSelectionChanged(object sender, EventArgs e)
{
var currentcell = dataGridView1.CurrentCellAddress;
var sendingCB = sender as DataGridViewComboBoxEditingControl;
DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[0];
// HERE IS THE LINE THAT THROES EXCEPTION WHEN MOVING FROM
// ONE COMBOXCELL to another.
cel.Value = sendingCB.SelectedValue.ToString();
}
}