• DataGridView的用法


         DataGridView是一个比较常用的控件,下面用一个实例来介绍一下具体的使用过程。

         实例中是一个简单的管理学生信息的界面。如下:

    image

    下面将从以下几个方面来介绍:

    DataGridView的初始化
    DataGridView与List实体的绑定;
    DataGridView与DataTable的绑定;
    DataGridView其他一些需要注意的地方;

    DataGridView的初始化

         有几种方法可以进行初始化,第一种方法如下:

       1: dgv.BorderStyle = BorderStyle.None;
       2:  
       3: DataGridViewImageColumn imgCol = new DataGridViewImageColumn();
       4: imgCol.HeaderText = "";
       5: imgCol.Image = Properties.Resources._2vgrid;
       6: imgCol.Width = 20;
       7: dgv.Columns.Add(imgCol);
       8:  
       9: dgv.Columns.Add("StudnetId", "Id");
      10: dgv.Columns["StudnetId"].DataPropertyName = "StudnetId";
      11: dgv.Columns["StudnetId"].Visible = false;
      12:  
      13: dgv.Columns.Add("StudentName", "学生姓名");
      14: dgv.Columns["StudentName"].DataPropertyName = "StudentName";
      15: dgv.Columns["StudentName"].Width = 120;
      16:  
      17: dgv.Columns.Add("Age", "年龄");
      18: dgv.Columns["Age"].DataPropertyName = "Age";
      19: dgv.Columns["Age"].Width = 60;
      20:  
      21: dgv.Columns.Add("Grade", "综合测评分数");
      22: dgv.Columns["Grade"].DataPropertyName = "Grade";
      23: dgv.Columns["Grade"].Width = 120;
      24: DataGridViewCellStyle dataGridViewCellStyle1 = new DataGridViewCellStyle();
      25: dataGridViewCellStyle1.Format = "N0";//N0代表不显示小数,因为MetaLength默认是decimal类型的,展示的时候,不需要显示小数位
      26: dataGridViewCellStyle1.NullValue = null;
      27: dgv.Columns["Grade"].DefaultCellStyle = dataGridViewCellStyle1;
      28:  
      29:  
      30: dgv.Columns.Add("Major", "专业");
      31: dgv.Columns["Major"].DataPropertyName = "Major";
      32: dgv.Columns["Major"].Width = 120;
      33:  
      34: dgv.Columns.Add("Remark", "备注");
      35: dgv.Columns["Remark"].DataPropertyName = "Remark";
      36: dgvStudent.Columns["Remark"].Width = 100;

    第二种方法如下:

       1: DataGridViewCheckBoxColumn colCheck = new DataGridViewCheckBoxColumn();
       2: colCheck.Name = "colCheck";
       3: colCheck.Width = 40;
       4: colCheck.HeaderText = "查找";
       5:  
       6: DataGridViewTextBoxColumn colField = new DataGridViewTextBoxColumn();
       7: colField.Name = "colField";
       8: colField.Width = 200;
       9: colField.HeaderText = "字段";
      10: colField.DataPropertyName = "column_name";
      11: colField.ReadOnly = true;
      12:  
      13: DataGridViewComboBoxColumn colOperate = new DataGridViewComboBoxColumn();
      14: colOperate.Name = "colOperate";
      15: colOperate.Width = 60;
      16: colOperate.HeaderText = "表达式";
      17: colOperate.DataPropertyName = "Operate";
      18: colOperate.Items.AddRange(new string[]{">",">=","=","<=","<"});
      19:  
      20: dgv.Columns.AddRange(new DataGridViewColumn[] { 
      21:     colCheck,
      22:     colField,
      23:     colOperate
      24: );

    用第二种方法初始化的时候,可以加载不同的类型,比如说可以在DataGridView上面加载Combox,CheckBox等等。

    DataGridView与List实体的绑定

    DataGridView与实体进行绑定时,只需要将每一列的DataPropertyName属性设置为实体的字段属性,然后通过DataSource进行绑定即可。

    DataGridView与DataTable的绑定

    DataGridView与DataTable可以直接绑定,如果你方法所返回的是一个DataTable,那么不需要初始化DataGridView的列,就可以进行绑定,只不过这时候DataGridView列头上显示的是英文的字段名(也就是select语句里面选出来的字段)。如果你想显示成中文的,那么你就需要初始化这个DataGridView的值,然后把DataPropertyName属性值设置为对应的英文字段即可。

    DataGridView与DataTable进行绑定比与实体List进行绑定有一个好处,那就是与DataTable绑定后,你点击列头可以进行排序,而与List绑定后没有这个功能。

    如图:

    与DataTable绑定:(鼠标放在列头上有一个小三角,点击可以排序)

    image
    与List实体绑定:(没有小三角,点击不能排序)

    image

    很多时候,我们都需要进行排序,所以我们一般情况是与DataTable进行绑定,但是有很多时候,我们的方法返回的是一个List实体,这个时候,我们就需要把我们的实体集合转换成DataTable然后再进行绑定。

    把List实体转换成DataTable有一个泛型的方法,如下:

       1: public static DataSet ConvertToDataSet<T>(IList<T> list)
       2: {
       3:     DataSet ds = new DataSet();
       4:     DataTable dt = new DataTable(typeof(T).Name);
       5:     DataColumn column;
       6:     DataRow row;
       7:  
       8:     System.Reflection.PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
       9:  
      10:     // 建立空表
      11:     if (list == null || list.Count <= 0)
      12:     {
      13:         for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
      14:         {
      15:             System.Reflection.PropertyInfo pi = myPropertyInfo[i];
      16:  
      17:             string name = pi.Name;
      18:  
      19:             if (dt.Columns[name] == null)
      20:             {
      21:                 column = new DataColumn(name, pi.PropertyType);
      22:                 dt.Columns.Add(column);
      23:             }
      24:         }
      25:     }
      26:     else
      27:     {
      28:         foreach (T t in list)
      29:         {
      30:             if (t == null)
      31:             {
      32:                 continue;
      33:             }
      34:             row = dt.NewRow();
      35:             for (int i = 0, j = myPropertyInfo.Length; i < j; i++)
      36:             {
      37:                 System.Reflection.PropertyInfo pi = myPropertyInfo[i];
      38:                 string name = pi.Name;
      39:                 if (dt.Columns[name] == null)
      40:                 {
      41:                     column = new DataColumn(name, pi.PropertyType);
      42:                     dt.Columns.Add(column);
      43:                 }
      44:                 row[name] = pi.GetValue(t, null);
      45:             }
      46:             dt.Rows.Add(row);
      47:         }
      48:     }
      49:  
      50:     ds.Tables.Add(dt);
      51:     return ds;
      52: }

    相反的,有时候,我们需要把一个DataTable转换成一个List实体,下面有一个方法是把一个DataRow转换成一个实体。循环调用这个方法即可。

       1: public static T ConvertToEntity<T>(DataRow dr)
       2: {
       3:     // 得到模型的类型
       4:     Type type = typeof(T);
       5:     T instance = (T)Activator.CreateInstance(type);
       6:  
       7:     PropertyInfo[] pis = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty | BindingFlags.SetField);
       8:  
       9:     foreach (PropertyInfo pi in pis)
      10:     {
      11:         string strColumnName = pi.Name;
      12:         if (dr[strColumnName] != DBNull.Value)
      13:         {
      14:             pi.SetValue(instance, dr[strColumnName], null);
      15:         }
      16:     }
      17:     return instance;
      18: }

    DataGridView滚动到选中的行

    在使用DataGridView的过程中,如果数据量非常多,当我们增加一条数据的时候,这条数据一般是放在最下面的一行,我们让最下面的一行选中,但是滚动条却不滚动到最后的一行的那个位置。最后发现了原因,那就是滚动条不跟着选中的行滚动,而是跟着选中的单元格滚动,也就是你要设置CurrentCell才能让它滚动到选定的行,用下面的代码即可:(下面代码中的Cells[1],可以把数字1换成具体的列名,换成列名后出错的概率要小一些)

    dgvProductType.Rows[selectIndex].Selected = true;
    dgvProductType.CurrentCell = dgvProductType.Rows[selectIndex].Cells[1];

    DataGridView其他一些需要注意的地方

    在使用DataGridView的过程中,还有一些地方需要注意一下,一般在初始化的时候,需要设置以下属性。

       1: grid.GridColor = SystemColors.ControlDark;
       2: grid.AutoGenerateColumns = false;
       3: grid.Columns.Clear();
       4: grid.Rows.Clear();
       5: grid.MultiSelect = false;
       6: grid.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
       7: grid.BorderStyle = BorderStyle.Fixed3D;
       8: grid.ReadOnly = true;
       9: grid.AllowUserToAddRows = false;

    特别是最后一个属性,“是否允许用户增加行”,如果允许的话,那么每次你增加一行,它会自动在你下面增加一行,但由于我们每一行第一列都是一个图片,但是它自动帮我们加的一行又没有设置图片,这样就非常难看,如下图:

    image

    设置成true后,就没有最后一行,如下图:

    image

    另外一个需要注意的地方就是,如果你显示小数的时候,不想显示小数点后面的数字,那么你可以用下面的代码:

       1: DataGridViewCellStyle dataGridViewCellStyle1 = new DataGridViewCellStyle();
       2: dataGridViewCellStyle1.Format = "N0";//N0代表不显示小数,因为MetaLength默认是decimal类型的,展示的时候,不需要显示小数位
       3: dataGridViewCellStyle1.NullValue = null;
       4: dgv.Columns["Grade"].DefaultCellStyle = dataGridViewCellStyle1;
  • 相关阅读:
    高精度 模板
    《图论》邻接表
    模板整理
    H
    C
    同余定理的应用(处理大数
    H
    1153: 简易版最长序列
    1152: 二分搜索
    1151: 大整数加法(正数)
  • 原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2612000.html
Copyright © 2020-2023  润新知