真正的DataGridViewComboBoxColumn

.NetFramework 2.0里提供的 DataGridViewComboBoxColumn 只有在以下情况下才正常工作:它的所有单元格值(由 DataGridView.DataSource 属性填充)与选择的范围(由 DataSource 属性或 Items 属性填充)之间存在映射。如果此映射不存在,则当该列位于视图中时,会出现消息“进行格式设置时出现错误,显示”。因此,这个ComboBox无法进行自由编辑,我写了个扩展的 DataGridViewComboEditBoxColumn 类实现了ComboBoxStyle.DropDown的功能,代码的关键点为两处,一是在显示时将ComboBoxColumn以及ComboBox的Items添加入所有可能出现的项,在GetFormattedValue时实现,二是在编辑验证ComboBox数据时即时插入新项,在ComboBox.Validating时实现。
None.gif      public   class  DataGridViewComboEditBoxCell : DataGridViewComboBoxCell
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
InBlock.gif           
InBlock.gif            ComboBox comboBox 
= base.DataGridView.EditingControl as ComboBox;
InBlock.gif            
if (comboBox != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                comboBox.DropDownStyle 
= ComboBoxStyle.DropDown;
InBlock.gif                comboBox.Validating 
+= new CancelEventHandler(comboBox_Validating);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (value != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (value.ToString().Trim() != string.Empty)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if (Items.IndexOf(value) == -1)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        Items.Add(value);
InBlock.gif                        DataGridViewComboBoxColumn col 
= OwningColumn as DataGridViewComboBoxColumn;
InBlock.gif                        col.Items.Add(value);
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
return base.GetFormattedValue(value, rowIndex, ref cellStyle, valueTypeConverter, formattedValueTypeConverter, context);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
void comboBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            DataGridViewComboBoxEditingControl cbo 
= sender as DataGridViewComboBoxEditingControl;
InBlock.gif            
if (cbo.Text.Trim() == string.Empty) return;
InBlock.gif
InBlock.gif            DataGridView grid 
= cbo.EditingControlDataGridView;
InBlock.gif            
object value = cbo.Text;
InBlock.gif            
// Add value to list if not there
InBlock.gif
            
InBlock.gif            
if (cbo.Items.IndexOf(value) == -1)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                DataGridViewComboBoxColumn cboCol 
= grid.Columns[grid.CurrentCell.ColumnIndex] as DataGridViewComboBoxColumn;
InBlock.gif                
// Must add to both the current combobox as well as the template, to avoid duplicate entriesdot.gif
InBlock.gif
                cbo.Items.Add(value);
InBlock.gif                cboCol.Items.Add(value);
InBlock.gif                grid.CurrentCell.Value 
= value;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif
None.gif    
public   class  DataGridViewComboEditBoxColumn : DataGridViewComboBoxColumn
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
public DataGridViewComboEditBoxColumn()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            DataGridViewComboEditBoxCell obj 
= new DataGridViewComboEditBoxCell();
InBlock.gif            
this.CellTemplate = obj;
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

None.gif

转载于:https://www.cnblogs.com/dotAge/archive/2006/07/14/450870.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值