关于在MDI窗体中DataGridView里的自写DataGridViewComboboxColumn丢失Items的问题
最近做个东西,需要在在MDI窗体中使用DataGridView,由于.net中的DataGridViewComboboxColumn不支持编辑,因此自己写了个新的DataGridViewComboboxEditingColumn。在该类中使用List<string>类型的Items属性绑定数据项,在用Single Form 测试的过程中完全正常,但是发现在MDI中读取DataGridViewComboboxEditingColumn的Items属性为null。MDI窗口中的Form_Load中初始化
DataGridViewComboBoxEditingColumn teacherColumn = new DataGridViewComboBoxEditingColumn();
teacherColumn.DataPropertyName = PropertyName.TeacherName.ToString();
teacherColumn.Name = "TeacherName";
teacherColumn.HeaderText = "姓名";
teacherColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
teacherColumn.Items = teachersNames;//List<string> teachersName=new List<string>{"AA","BB"};dataGridView1.Columns.Insert(0, teacherColumn);
其中DataGridViewComboboxEditingColumn的定义代码如下:
public class DataGridViewComboboxEditingColumn: DataGridViewColumn
{
private List<string> items;
public List<string> Items
{
get
{
if (items == null)
{
items = new List<string>();
}
return items;
}
set
{
if (!value.GetType().IsAssignableFrom(typeof(List<string>)))
{
throw new Exception("value值必须是List<string>类型");
}
if (items != null)//但后面在此读取Items属性时,发现items为null,因此不能成功加载teachersName列表中的项 {
items.Clear();
items.AddRange(value);
}
else
{
items = value;//在此处确实赋过值 }
}
}
public DataGridViewComboboxEditingColumn()
: base(new DataGridViewComboboxEditingCell())
{
}
public override DataGridViewCell CellTemplate
{
get
{
return base.CellTemplate;
}
set
{
if (value == null || !value.GetType().IsAssignableFrom(typeof(DataGridViewComboBoxEditingCell)))
{
throw new Exception("Must be DataGridViewComboxEditingCell type");
}
base.CellTemplate = value;
}
}
private DataGridViewComboBoxEditingCell ComboBoxCellTemplate
{
get
{
return (DataGridViewComboBoxEditingCell )this.CellTemplate;
}
}
}
///
DataGridViewComboBoxEditingCell 的部分代码如下:
public class DataGridViewComboBoxEditingCell : DataGridViewTextBoxCell
{
public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
DataGridViewComboBoxEditingControl clt = DataGridView.EditingControl as DataGridViewComboBoxEditingControl;
DataGridViewComboBoxEditingColumn col = (DataGridViewComboBoxEditingColumn )OwningColumn;
if (clt != null)
{
clt.DropDownStyle = ComboBoxStyle.DropDown;
clt.AutoCompleteSource = AutoCompleteSource.ListItems;
clt.AutoCompleteMode = AutoCompleteMode.Suggest;
clt.Validating += new System.ComponentModel.CancelEventHandler(clt_Validating);
string str = initialFormattedValue as string;
if (str != null && str.Trim() != string.Empty && clt.Items.IndexOf(str.Trim()) == -1)
{
clt.Items.Add(str.Trim());
}
if (str != null && str.Trim() != string.Empty && col.Items.IndexOf(str.Trim()) == -1)
{
col.Items.Add(str.Trim());
}
clt.Items.Clear();
clt.Items.AddRange(col.Items.ToArray());
clt.Text = Convert.ToString(str);
}
void clt_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
...........
}
} --------------------编程问答-------------------- 也许是MDI本身的特性导致的,,用普通窗体测试一下是否有item 如果普通的有 mdi没有 你就知道解决该问题的方向了 google一下很快就能找到答案 --------------------编程问答-------------------- public class DataGridViewComboboxEditingColumn: DataGridViewComboBoxEditingControl
//or DataGridViewComboBoxColumn
补充:.NET技术 , C#