C# WinForm 关于DataGridView
由于在项目中需要用到DataGridView 显示数据,遇到可记录的关于DataGridView的属性和时间
-
设置DataGridView 的字体大小
datagridview.Font = new System.Drawing.Font(“宋体”, 15); -
选中整行
datagridview.SelectionMode = DataGridViewSelectionMode.FullRowSelect; -
只能选中一行
datagridview.MultiSelect = false;//true 可多选 -
自动填充列的宽度
datagridview.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; -
行的最前端 空白列 不显示
datagridview.RowHeadersVisible = false; -
禁止自动添加列
datagridview.AutoGenerateColumns = false; -
绑定数据
DataTable table = new DataTable();
datageidview.DataSource = table; -
代码添加列
DataGridViewCell dgvcell1 = new DataGridViewTextBoxCell();//声明一个单元格,输入框类型
DataGridViewColumn column= new DataGridViewColumn();//声明一个列
column.Name = “列名”;//不显示,取值时使用
column.DataPropertyName = “绑定的表格中的列名”;
column.HeaderText = “列标题”;//显示在表格的最上面
column.CellTemplate = dgvcell1;//此列单元格的模板
column.ReadOnly = true;//只读 -
DataGridView 中 点击CheckBox 所在单元格即选中CheckBox
1、 先设置CheckBox 列 为ReadOnly
2、 在 DataGridView的CellClick 事件中,写入一下代码
private void DataGridView_CellClick(object sender,DataGridViewCellEventArgs e)
{
try
{
//e.ColumnIndex 为当前点击的单元格的列的下标
//e.RowIndex为当前点击的单元格的行的下标
int CheckColumnIndex=0;//DataGridView中 CheckBox 列的下标
//判断如果当前点击的单元格是checkBox 并且 不是列的头部
if(e.columnIndex == CheckColumnIndex && e.RowIndex >= 0 )
{
bool bl_checked = (bool)this.datagridview.rows[e.RowIndex].cells[e.ColumnIndex].formattedValue;//获取当前单元格的格式化的值
this.datagridview.rows[e.RowIndex].cells[e.ColumnIndex].Value = !bl_checked ;//设置为相反状态,达到点击选中,再点击取消 目的
}
}
catch(Exception ex){
MessageBox.Show(ex.Message);
}
}
-
点击DataGridView 列头 触发的事件为 ColumnHeaderMouseClic
-
设置 双击DataGridView时不排序
foreach(DataGridViewColumn column in datagridview.Columns) { column.SortMode = DataGridViewColumnSortMode.NotSortable; }
-
循环DataGridView选中行集合(不是选中数据行的单元格的checkbox噢)
由于删除时,DataGridView中行的下标是一直变化的,所以,从最后的选中行开始循环
for(int i = datagridview.SelectedRows.Count-1;i>=0;i--)
{
int index = datagridview.SelectedRows[i].Index;//获取选中行的下标
this.datagridview.Rows.RemoveAt(index);//删除指定下标的行
}
- 显示数据时,用“*”代替字母时,可以用CellForMatting 事件
但此时修改此列单元格数据时,还是会显示出输入的数据哦~
private void datagridview_CellFormatting(object sender,DataGridViewCellFormattingEventArgs e)
{
//pwd 是 datagridview 中 需要显示 * 的列的列名
if(this.datagridview.Columns[e.ColumnIndex].Name = "pwd")//判断当前列的列名是否是需要用*的列名
{
if(e.Value !=null&&Convert.ToString(e.Value).Trim().Length >0)
{
e.Value = new string("*",Convert.ToString(e.Value).Trim().Length);
}
}
}
- 想要显示与修改时都用"*"代替,需要加上EdittingControlShowing时间哦
private void datagridview_EditingControlShowing(object sender,DataGridViewEditingControlShowingEventArgs e)
{
try{
TextBox box = e.Control as TextBox;
if(box != null)
{
//pwd 是 datagridview 中 需要显示 * 的列的列名
if(datagridview.columns[datagridview.CurrentCell.ColumnIndex].Name = "pwd")
{
box.PasswordChar = "*";
}
else
{
box.PasswordChar = new Char();
}
}
}
catch(Exception ex){
MessageBox.Show(ex.Message);
}
}
- 使用DataGridView显示数据时,某列只能添加,不能修改
两种方式实现
1、使用CellFormatting事件
private void datagridview_CellFormatting(object sender,DataGridViewCellFormattingEventArgs e)
{
if(datagridview.Columns[e.ColumnIndex].Name = "只能添加不能修改的列的列名")
{
if(!string.IsNullOrEmpty(Convert.ToString(e.Value)))
{
//datagridview.Rows[e.RowIndex].cells[e.ColumnIndex] 等于 datagridview[e.ColumnIndex,e.RowIndex]
datagridview.Rows[e.RowIndex].cells[e.ColumnIndex].ReadOnly = true;
}
}
}
2、 使用CellBeginEdit 事件
private void datagridview_CellBeginEdit(object sendder,DataGridViewCellCancelEventArgs e)
{
DataGridView dgv=(DataGridView)sender;
//判断是否可以编辑,如果列名为id并且 值不为空就不能编辑
if (dgv.Columns[e.ColumnIndex].Name == "id" && !string.IsNullOrEmpty(Convert.ToString(dgv["id", e.RowIndex].Value)))
{
//不能编辑
e.Cancel = true;
}
}
-
数据绑定情况下,向datagridview添加新行
DataTable table = (DataTable)datagridview.DataSource;
DataRow row=table.NewRow();
table.Rows.Add(row); -
点击按钮时,选中单元格为编辑状态
dgv_vipinfo.Focus(); //获取datagridview的焦点
dgv_vipinfo.CurrentCell = dgv_vipinfo.CurrentRow.Cells[“user_no”]; //把要指定为编辑单元格的信息赋给当前活动的单元格
this.dgv_vipinfo.BeginEdit(true);//开始编辑
好啦,学的比较基础,暂时就这样啦,以后碰到其他的再更新。
有更好的方法或者其他关于DataGridView控件的知识,非常希望能够学习!!!
如果哪里有错误,欢迎指出!!!