当前位置:编程学习 > C#/ASP.NET >>

关于在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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,