DataGridViewComboBox 索引更改事件故障

Posted

技术标签:

【中文标题】DataGridViewComboBox 索引更改事件故障【英文标题】:DataGridViewComboBox Index Changed Event Trouble 【发布时间】:2012-11-23 13:55:21 【问题描述】:

希望有人可以帮助解决这个问题。我的代码中有一个无法修复的错误。我正在使用带有 DataGridView 控件的选定索引事件处理进行测试。

我创建了两列:-

第 0 列是 DataGridViewTextBoxColum 第 1 列是 DataGridViewComboBoxColumn

我给我的ComboBox 列提供了一个数据源,它是一个小的DataTable,由UsernameUserID 两列组成。

显示成员设置为用户名列,我将用户 ID 列设置为值成员。

我要做的只是第 0 列(DataGridViewTextBox),在 DataGridViewComboBoxColumn 的 Index Changed 事件中填充 UserID(ValueMember)。

当我第一次加载程序时它工作正常。 IndexChanged 事件触发没有任何错误。但是如果我尝试在新行中选择ComboBox,它会从上一行清除组合框中的值,然后抛出空引用异常。

我列出了下面的代码并突出显示了它失败的代码行:-

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();


        


    

【问题讨论】:

【参考方案1】:

换行试试:-DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[0];

DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[1];

【讨论】:

以上是关于DataGridViewComboBox 索引更改事件故障的主要内容,如果未能解决你的问题,请参考以下文章

使用 DataGridView Combobox 的 SelectionChangeCommitted 事件获取新值或索引

将 DataGridViewComboBox 默认设置为等于现有 DataGridView 列

DataGridViewComboBox 数据源

DataGridViewCombobox 列中的自动完成有啥奇怪的行为?

如何从填充 DataGridViewComboBox 中选择一个项目

值未显示在 DataGridViewComboBox 控件上