InitializeComponent(); this .dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect; BindCombox(); BindDatasources(); int vscroll = 0 , hscroll = 0 ; #region datagridview 绑定数据自动刷新、添加、删除等 /// <summary> /// datagridview 数据源 /// 必须使用BindingList, 如果使用LIST,无法实现更改,添加、删除数据源自动更新datagridview /// </summary> BindingList<Studect> studentLst = new BindingList<Studect> (); void BindDatasources() studentLst.Add( new Studect() { Name = " A " , Age = 10 , UpdateTime = DateTime.Now.ToString(), Sex = 1 }); studentLst.Add( new Studect() { Name = " B " , Age = 10 , UpdateTime = DateTime.Now.ToString(), Sex = 1 }); studentLst.Add( new Studect() { Name = " C " , Age = 10 , UpdateTime = DateTime.Now.ToString(), Sex = 1 }); studentLst.Add( new Studect() { Name = " D " , Age = 10 , UpdateTime = DateTime.Now.ToString(), Sex = 1 }); studentLst.Add( new Studect() { Name = " E " , Age = 10 , UpdateTime = DateTime.Now.ToString(), Sex = 0 }); this .dataGridView1.DataSource = studentLst; dataGridView1.FirstDisplayedScrollingRowIndex = vscroll; dataGridView1.HorizontalScrollingOffset = hscroll; private void button1_Click( object sender, EventArgs e) studentLst.Add( new Studect() { Name = DateTime.Now.ToString(), Age = 10 , UpdateTime = DateTime.Now.ToString() }); private void button2_Click( object sender, EventArgs e) if (dataGridView1.SelectedRows != null ) Studect s = dataGridView1.CurrentRow.DataBoundItem as Studect; if (s != null ) studentLst.Remove(s); #endregion #region datagridview 添加combox下拉框 ComboBox sexCmb = new ComboBox(); private void BindCombox() List <ContainerType< int >> SexLst = new List<ContainerType< int >> () new ContainerType< int >(){ Value = 0 ,Describle= " " }, new ContainerType< int >(){ Value = 1 ,Describle= " " }, #region 方法一 // sexCmb.DisplayMember = "Describle"; // sexCmb.ValueMember = "Value"; // sexCmb.DataSource = SexLst; // sexCmb.DropDownStyle = ComboBoxStyle.DropDownList; // sexCmb.DrawMode = DrawMode.OwnerDrawFixed; // sexCmb.DrawItem += SexCmb_DrawItem; /// / 设置下拉列表框不可见 // sexCmb.Visible = false; /// / 添加下拉列表框事件 // sexCmb.SelectedIndexChanged += new EventHandler(cmb_Temp_SelectedIndexChanged); // dataGridView1.Scroll += dataGridView1_Scroll; // dataGridView1.ColumnWidthChanged += dataGridView1_ColumnWidthChanged; // dataGridView1.CurrentCellChanged += dataGridView1_CurrentCellChanged; /// /dataGridView1.DataBindingComplete += DataGridView1_DataBindingComplete; /// / 将下拉列表框加入到DataGridView控件中 // this.dataGridView1.Controls.Add(sexCmb); #endregion #region 方法二 DataGridViewTextBoxColumn c1 = new DataGridViewTextBoxColumn(); c1.DataPropertyName = " Name " ; c1.HeaderText = " 名字 " ; dataGridView1.Columns.Add(c1); DataGridViewComboBoxColumn dgvCmb = new DataGridViewComboBoxColumn(); dgvCmb.DisplayMember = " Describle " ; dgvCmb.ValueMember = " Value " ; dgvCmb.DataSource = SexLst; dgvCmb.DataPropertyName = " Sex " ; dgvCmb.HeaderText = " 性别 " ; // dgvCmb.FlatStyle = FlatStyle.Flat; dgvCmb.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; // dgvCmb. dataGridView1.Columns.Add(dgvCmb); // dataGridView1.CellEnter += DataGridView1_CellEnter; dataGridView1.EditingControlShowing += DataGridView1_EditingControlShowing; dataGridView1.CellEndEdit += DataGridView1_CellEndEdit; // dataGridView1.e #endregion private void DataGridView1_CellEnter( object sender, DataGridViewCellEventArgs e) // 实现单击一次显示下拉列表框 if (dataGridView1.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn && e.RowIndex != - 1 ) SendKeys.SendWait( " {F4} " ); private void DataGridView1_CellEndEdit( object sender, DataGridViewCellEventArgs e) if (sexCmb != null ) sexCmb.DrawItem -= Cmb_DrawItem; // sexCmb.Dispose(); sexCmb = null ; private void DataGridView1_EditingControlShowing( object sender, DataGridViewEditingControlShowingEventArgs e) if (e.Control.GetType() == typeof (DataGridViewComboBoxEditingControl)) sexCmb = e.Control as ComboBox; sexCmb.DrawMode = DrawMode.OwnerDrawFixed; sexCmb.DrawItem += Cmb_DrawItem; private void Cmb_DrawItem( object sender, DrawItemEventArgs e) ComboBox combox = sender as ComboBox; Pen fColor = new Pen(Color.Black); Pen bColor = new Pen(Color.White); var a = combox.Items[e.Index] as ContainerType< int > ; if (a.Value == 0 ) fColor = new Pen(Color.Green); fColor = new Pen(Color.Red); if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) bColor = new Pen(Color.Blue); fColor = new Pen(Color.White); e.Graphics.FillRectangle(bColor.Brush, e.Bounds); e.Graphics.DrawString(a.Describle, this .Font, fColor.Brush, e.Bounds); // combox.DrawItem -= Cmb_DrawItem; private void Combox_SelectedIndexChanged( object sender, EventArgs e) ComboBox combox = sender as ComboBox; combox.SelectedIndexChanged -= Combox_SelectedIndexChanged; private void SexCmb_DrawItem( object sender, DrawItemEventArgs e) // 初始化字体和背景色 Pen fColor = new Pen(Color.Black); Pen bColor = new Pen(Color.White); // if (e.Index < 0) return; var a = sexCmb.Items[e.Index] as ContainerType< int > ; if (a.Value == 0 ) fColor = new Pen(Color.Green); fColor = new Pen(Color.Red); e.Graphics.FillRectangle(bColor.Brush, e.Bounds); e.Graphics.DrawString(a.Describle, this .Font, fColor.Brush, e.Bounds); private void DataGridView1_DataBindingComplete( object sender, DataGridViewBindingCompleteEventArgs e) for ( int i = 0 ; i < this .dataGridView1.Rows.Count; i++ ) // for (int c = 0; c < dataGridView1.Columns.Count; c++) if (dataGridView1.Rows[i].Cells[ 2 ].Value != null ) if (dataGridView1.Rows[i].Cells[ 2 ].Value.ToString().Trim() == " 1 " ) dataGridView1.Rows[i].Cells[ 2 ].Value = " " ; else if (dataGridView1.Rows[i].Cells[ 2 ].Value.ToString().Trim() == " 0 " ) dataGridView1.Rows[i].Cells[ 2 ].Value = " " ; // 当用户移动到性别这一列时单元格显示下拉列表框 private void dataGridView1_CurrentCellChanged( object sender, EventArgs e) DataGridViewCell CurrnetCell = dataGridView1.CurrentCell; if (CurrnetCell != null && CurrnetCell.OwningColumn.HeaderText == " 性别 " ) Rectangle TmpRect = dataGridView1.GetCellDisplayRectangle(CurrnetCell.ColumnIndex, CurrnetCell.RowIndex, false ); sexCmb.SelectedValue = CurrnetCell.Value; // sexCmb.Text = CurrnetCell.Value.ToString(); sexCmb.Size = TmpRect.Size; sexCmb.Top = TmpRect.Top; sexCmb.Left = TmpRect.Left; sexCmb.Visible = true ; sexCmb.Visible = false ; // 滚动DataGridView时将下拉列表框设为不可见 private void dataGridView1_Scroll( object sender, ScrollEventArgs e) if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) hscroll = e.NewValue; else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) vscroll = e.NewValue; this .sexCmb.Visible = false ; // 改变DataGridView列宽时将下拉列表框设为不可见 private void dataGridView1_ColumnWidthChanged( object sender, DataGridViewColumnEventArgs e) this .sexCmb.Visible = false ; private void button3_Click( object sender, EventArgs e) if (dataGridView1.SelectedRows != null ) Studect s = dataGridView1.CurrentRow.DataBoundItem as Studect; if (s != null ) s.Name = DateTime.Now.ToString(); //修改名称,界面自动更新 // 当用户选择下拉列表框时改变DataGridView单元格的内容 private void cmb_Temp_SelectedIndexChanged( object sender, EventArgs e) dataGridView1.CurrentCell.Value = ((ComboBox)sender).SelectedValue; // sexComb #endregion /// <summary> /// </summary> public class Studect : INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String info) PropertyChanged ?.Invoke( this , new PropertyChangedEventArgs(info)); string _name; [DisplayName( " 你的名字 " )] // 这是显示的列名称哦 public string Name get { return _name; } if (_name != value) _name = value; NotifyPropertyChanged( " Name " ); // 2) 在属性改变时引发事件 int _age; [DisplayName( " 他的年纪 " )] public int Age get { return _age; } if (_age != value) _age = value; int _sex; [DisplayName( " 性别 " )] public int Sex get { return _sex; } set { _sex = value; } // List<ContainerType<int>> _sexlst; // [DisplayName("性别")] // public List<ContainerType<int>> SexLst // get { return _sexlst; } // set { _sexlst = value; } string _updateTime; [DisplayName( " 更新时间 " )] public string UpdateTime get { return _updateTime; } if (_updateTime != value) _updateTime = value; public class ContainerType<T> public T Value { get ; set ; } public string Describle { get ; set ; }