0

誰かがこれを手伝ってくれることを願っています。コードに修正できないバグがあります。DataGridViewコントロールでSelectedIndexイベント処理を使用してテストしています。

2つの列を作成しました:-

列0はDataGridViewTextBoxColum 列1はDataGridViewComboBoxColumn

&である2つの列で構成されるComboBox小さなデータソースを列に指定しました。DataTableUsernameUserID

表示メンバーはユーザー名列に設定されており、ユーザーID列はValueMemberとして設定されています。

私が探しているのは、列0( )であり、のIndex Changedイベントに( )DataGridViewTextBoxを入力します。UserIDValueMemberDataGridViewComboBoxColumn

プログラムを最初にロードしたときは正常に動作します。イベントは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();


        }


    }
4

1 に答える 1