C# DataGridView控件与ListView控件的对比学习(一):DataGridView控件学习

一、DataGridView控件介绍:

    1、定义:

        DataGridView控件是一种方便用户浏览和编辑来自不同类型数据源的数据的一种表格式控件。从这个定义中,我们可以获取几点有关DataGridView控件的特性。首先,DataGridView控件对于获取的数据有两个重要的功能:第一,浏览;第二,编辑。当然,重点学习的肯定是“编辑”这一功能;其次,DataGridView控件可以处理来自不同类型数据源的数据,也就是说,对于String类型、int类型、float类型、char类型等等数据类型来说,DataGridView控件都可以处理;最后,DataGridView控件是一种表格式控件,有行、有列、有单元格等等。

    2、绑定数据:

    我们从数据库中获取数据的最后几步是:


    
    
    
    
1
2
3
4
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;  

    所以我们可以使用以下步骤来给DataGridView控件绑定数据:


    
    
    
    
dataGridView1.DataSource = dt;

    如果数据源是一个List呢,或者一个数组,那么还可以使用dataGridView1.DataSource=list来设置吗?(可以尝试一下)

    注意,在上述步骤中填充的是DataTable,如果填充的是DataSet,如下所示:


    
    
    
    
using (OleDbConnection myConn = new OleDbConnection(strCon))
using (OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn))
{
    myConn.Open();
    myCommand.Fill(ds);
}
if (ds == null || ds.Tables.Count <= 0) return null;
return ds.Tables[0];

    因为,DataSet类中包含DataTable,所以可以使用ds.Tables[0]来获取DataSet中的第一个DataTable;

进阶:

    如果数据量过大时,我们可能会使用到显示多少条,以及选中的是第几条数据,这时,我们可以使用到BindingNavigator控件和BindingSource控件,其中,BindingNavigator控件时用来导航的,BindingSource控件用来充当两者的数据源,也就是说,当使用BindingNavigator控件作为DataGridView控件的导航时,两者必须是同一数据源。使用方法如下:


    
    
    
    
this.bindingSource1.DataSource = GetDataFromSql();
dataGridView1.DataSource = this.bindingSource1;
this.bindingNavigator1.BindingSource = this.bindingSource1;

    3、操作DataGridView控件:

        之前说过,DataGridView控件可以处理来自不同数据类型的数据源中的数据,而且该控件是一种表格式控件,有行、有列、有单元格。在这儿需要注意,默认情况下,单元格的值的类型为object。当被绑定数据后,会设置它的ValueType属性,它包含的单元格的ValueType也随之更新。

  • 1.DataGridView取得或者修改当前单元格的内容:

    当前单元格指的是 DataGridView焦点所在的单元格,它可以通过 DataGridView对象的 CurrentCell属性取得。当前单元格不存在的时候返回null。

    
    
    
    
//
Console.WriteLine(DataGridView1.currentCell.Value);
// Index
Console.WriteLine(DataGridView1.currentCell.columnIndex);
// Index
Console.WriteLine(DataGridView1.currentCell.RowIndex);  
  • 2. DataGridView设定单元格只读:

        1)使用 ReadOnly属性

           设置DataGridView内所有单元格都不可编辑:

     
     
     
     
// DataGridView1
DataGridView1.ReadOnly = true;

        此时用户的新增行操作和删除行操作也被屏蔽了。

     
     
     
     
// DataGridView1 2
DataGridView1columns[1].ReadOnly = true;
// DataGridView1 3
DataGridView1.Rows[2].ReadOnly = true;
// DataGridView1[00]
DataGridView1[0, 0].ReadOnly = true;

        2)使用 EditMode属性

        DataGridView.EditMode属性被设置为 DataGridView.EditMode.EditProgrammatically时,用户就不能手动编辑单元格的内容了。但是可以通过程序调用 DataGridView.BeginEdit方法使单元格进入编辑模式进行编辑。

     
     
     
     
DataGridView1.EditMode = DataGridView.EditMode.EditProgrammatically;

        3)根据条件设定单元格的不可编辑状态

        当一个一个的通过单元格坐标设定单元格 ReadOnly属性的方法太麻烦的时候,你可以通过 CellBeginEdit事件来取消单元格的编辑。

     
     
     
     
// CellBeginEdit
void DataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    // 
    if (dgvcolumns[e.columnIndex].Name == "Column1" && !(bool)dgv["Column2", e.RowIndex].Value)
    {
        //
        e.cancel = true;
    }
}  
  • 3.DataGridView行的用户删除操作的自定义:

        1)无条件的限制行删除操作。

        默认时, DataGridView是允许用户进行行的删除操作的。如果设置 DataGridView对象的 AllowUserToDeleteRows属性为 False时用户的行删除操作就被禁止了。

     
     
     
     
// DataGridView1
DataGridView1.AllowUserToDeleteRows = false;

        但是,通过 DataGridView.RowCollection.Remove还是可以进行行的删除。

        补足:如果 DataGridView绑定的是 DataView的话,通过 DataView.AllowDelete也可以控制行的删除。

        2)行删除时的条件判断处理。

        用户在删除行的时候,将会引发 DataGridView.UserDeletingRow事件。在这个事件里,可以判断条件并取消删除操作。

     
     
     
     
// DataGridView1 UserDeletingRow
void DataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
    // 
    if (MessageBox.Show("? ", "", MessageBoxButtons.OKCancel,
        MessageBoxIcon.Question) != DialogResult.OK)
    {
        // OK 
        e.Cancel = true;
    }
}  
  • 4.DataGridView列宽和行高自动调整的设定:

        1)设定行高和列宽自动调整

     
     
     
     
// Header
DataGridView1.AutoSizeColumnsMode = DataGridView.AutoSizeColumnsMode.AllCells;
// Header
DataGridView1.AutoSizeRowsMode = DataGridView.AutoSizeRowsMode.AllCells;

        AutoSizeColumnsMode属性的设定值枚举请参照 msdn的 DataGridView.AutoSizeRowsMode说明。

        2)指定列或行自动调整

     
     
     
     
//
DataGridView1.columns[0].AutoSizeMode =DataGridView.AutoSizeColumnMode.Displaye dCells;

        AutoSizeMode设定为 NotSet时默认继承的是 DataGridView.AutoSizeColumnsMode属性。

       3)设定列头的高度和行头的宽度自动调整

     
     
     
     
//
DataGridView1.columnHeaders.HeightSizeMode = DataGridView.ColumnHeaders.HeightSizeMode.AutoSize;
//
DataGridView1.RowHeaders.WidthSizeMode = DataGridView.RowHeaders.WidthSizeMode.AutoSizeToAllHeaders;  
  • 5.DataGridView冻结列或行

        1)列冻结

        DataGridViewColumn.Frozen属性为 True时,该列左侧的所有列被固定,横向滚动时固定列不随滚动条滚动而左右移动。这对于重要列固定显示很有用。

     
     
     
     
// DataGridView1 2
DataGridView1.columns[1].Frozen = true;

        但是, DataGridView.AllowUserToOrderColumns = True时,固定列不能移动到非固定列,反之亦然。

        2)行冻结

        DataGridViewRow.Frozen属性为 True时,该行上面的所有行被固定,纵向滚动时固定行不随滚动条滚动而上下移动。

     
     
     
     
// DataGridView1 3
DataGridView1.Rows[2].Frozen = true;  

        以上,是我从“C# DataGridView控件的使用”这篇文章中截取的比较常用的一些操作,网址是:http://www.cnblogs.com/icyJ/archive/2012/10/22/DataGridView.html,这篇文章对于DataGridView控件的使用说明的非常详细,可以看看。

  • 6.添加表头

        当我们使用DataGridView控件来呈现从数据库中获取的数据时,如果我们不做任何处理,DataGridView控件的表头会自动显示表中的字段名称,例如,id、name等,但是在数据库里面的字段名称大多都被我们设置为英文字段名,不方便直接显示在表头,此时就需要手动添加表头,代码如下:


     
     
     
     
private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {//
        DataGridView1.Columns["RealName"].HeaderText = "";
        DataGridView1.Columns["LogTime"].HeaderText = "";
        //
        DataGridView1.Columns["LogTime"].Width = 150;
        DataGridView1.Columns["FormName"].HeaderText = "";
        DataGridView1.Columns["FormName"].Width = 150;
        DataGridView1.Columns["CustomerID"].Visible = false;//
   }   

        示意图如下:

  • 7.为每行记录最后加“编辑”--“删除”按钮列

         在使用DataGridView控件显示数据时,增加、编辑、删除等操作是必不可少的,接下来将介绍两种增加、删除记录的方法。

         第一种:使用BindingNavigator控件:


     
     
     
     
this.bindingSource1.DataSource = GetDataFromSql();
dataGridView1.DataSource = this.bindingSource1;
this.bindingNavigator1.BindingSource = this.bindingSource1;  

        效果图如下:

        第二种:在每行记录后加“编辑”---“删除”按钮行:


     
     
     
     
//
//
UserdataGridView.AutoGenerateColumns = false;
//DataGridViewLinkColumn
DataGridViewLinkColumn dlink = new DataGridViewLinkColumn();
dlink.Text = "";//
dlink.Name = "linkEdit";
dlink.HeaderText = "";//
dlink.UseColumnTextForLinkValue = true;//dlink.Text
UserdataGridView.Columns.Add(dlink);//UserdataGridView
//
DataGridViewLinkColumn dlink2 = new DataGridViewLinkColumn();
dlink2.Text = "";
dlink2.Name = "linkDelete";
dlink2.HeaderText = "";
dlink2.UseColumnTextForLinkValue = true;
UserdataGridView.Columns.Add(dlink2);
        效果图如下:
 

你可能感兴趣的:(讲解)