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
; }