将 DGV 中的单元格类型从 ComboBox 更改为 TextBox 仅适用于第 0 行?

Posted

技术标签:

【中文标题】将 DGV 中的单元格类型从 ComboBox 更改为 TextBox 仅适用于第 0 行?【英文标题】:Changing cell type in DGV from ComboBox to TextBox only works for row 0? 【发布时间】:2010-07-30 09:29:23 【问题描述】:

我整天都在努力让我的 DataGridView 正常运行。当用户选择条目时,我正在使用以下代码将 ComboBox 单元格更改为 TextBox

它在第 0 行工作得很好,但对于所有其他行,组合框仍保留在屏幕上,即使调试表明它是一个文本框单元格! (检查 CurrentCell)。

有人知道吗?

这是一个sn-p:

void comboBox_SelectedIndexChanged(object sender, EventArgs e)
    
        DataGridViewComboBoxEditingControl cb = sender as DataGridViewComboBoxEditingControl;
        if (cb.SelectedIndex == 0 && dataGridViewReceivers.CurrentCell is DataGridViewComboBoxCell)
        
            cb.SelectedIndexChanged -= new EventHandler(comboBox_SelectedIndexChanged);
            dataGridViewReceivers.CellLeave -= new DataGridViewCellEventHandler(dataGridViewReceivers_CellLeave);
            dataGridViewReceivers.EndEdit();

            // Change to editing mode
            int row = dataGridViewReceivers.CurrentCell.RowIndex;
            dataGridViewReceivers[0, row] = new DataGridViewTextBoxCell();
            dataGridViewReceivers[0, row].Value = "";
            dataGridViewReceivers.BeginEdit(false);
            dataGridViewReceivers.RefreshEdit();

            dataGridViewReceivers.CellLeave += new DataGridViewCellEventHandler(dataGridViewReceivers_CellLeave);
            cb.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged); 
        
    

使用 BindingSource.AddNew() 添加新行。

谢谢!

编辑:

当我在事件处理程序之外调用代码来替换单元对象时 - 它可以工作!这表明值得尝试委托...

编辑:

问题已解决 事实证明,如果我在更换过程中从 DGV 上移开焦点,它就可以工作!只需暂时将焦点设置为按钮,然后再返回即可!

【问题讨论】:

代理解决不了你的问题。 不,你是对的。查看我的最后一次编辑! 【参考方案1】:

由于某种原因,DGV 不允许我在获得焦点时更改单元格类型。取消选择单元格是不够的 - 需要从控件中移除焦点。

这看起来像一个 .NET 错误!...

【讨论】:

以上是关于将 DGV 中的单元格类型从 ComboBox 更改为 TextBox 仅适用于第 0 行?的主要内容,如果未能解决你的问题,请参考以下文章

将 DataGridView 的单个单元格变成 Combobox

C# Winforms DataGridView 选定单元格正在清除单元格值

DataGridView获取或者设置当前单元格的内容

如何将特定行/单元格的类型从 int 更改为 varchar

C#datagridview在拖放值之前获取当前单元格值

设置datagridview单元格背景颜色[重复]