Winform控件——关于数据绑定:DataGridView、ComboBox、ListView、TreeView
零、这几个控件的总结图

一、DataGridView
1、DataGridView常用属性设置
1 //DataGridView属性设置 2 3 dgvList.AllowUserToAddRows = false;//不允许用户添加 4 dgvList.AllowUserToDeleteRows = false;//不允许用户删除 5 dgvList.AllowUserToResizeRows = false;//不允许用户调整行高 6 dgvList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;//所有列平分表格 7 8 dgvList.BackgroundColor = System.Drawing.SystemColors.Control;//背景色 9 10 dgvList.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;//列头高度 11 12 dgvList.MultiSelect = false;//不允许多选行 13 14 dgvList.ReadOnly = true;//表格只读 15 16 dgvList.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//整行选中 17 18 dgvList.AutoGenerateColumns = false;//绑定数据源时,不允许自动生成列
1 //列属性 2 pid.DataPropertyName = "id";//数据绑定的列名,或属性名 3 pid.HeaderText = "序号";//列头显示的名称 4 pid.Name = "id";//列控件的名称,可以根据该名称在表格中查找列 5 pid.ReadOnly = true;//列是否只读 6 pid.Visible = false;//列是否显示 7 pid.FillWeight = 70F;//表示当该列处于填充模式时,相对于控件中处于填充模式的其他列的宽度。默认值为 100
1 //DataGridView常订阅的事件 2 3 dgvList.Click += new System.EventHandler(this.dgvList_Click);//当表格控件被点击时触发 4 5 dgvList.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dgvList_CellFormatting);//在单元格的内容需要设置格式以便于显示时发生。例子如下: 6 private void dgvList_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 7 {//当单元格需要设置显示格式时触发 8 if (e.ColumnIndex > 2) 9 {//因为上班时间和下班时间列,放在第3、4列 10 dgvList.Columns[e.ColumnIndex].DefaultCellStyle.Format = "HH:mm"; 11 } 12 } 13 14 15 dgvList.CellMouseDoubleClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgvList_CellMouseDoubleClick);//双击单元格时触发 16 17 dgvList.SelectionChanged += new System.EventHandler(this.dgvList_SelectionChanged);//选择不同行、单元格时触发。另外每次绑定DataSource数据源的时候触发。 18 19 dgvList.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dgvList_KeyDown);//焦点在表格时,按下键盘键触发,比如选中一行按下Delete键 20 private void dgvList_KeyDown(object sender, KeyEventArgs e) 21 { 22 if (e.KeyCode == Keys.Delete) 23 {//如果按的是删除键 24 this.btn_Remove_Click(null, null); 25 } 26 }
2、从DataGridView中获取行所绑定的数据
1 private void dgvList_Click(object sender, EventArgs e) 2 {//表格被点击后 3 if (this.dgvList.SelectedRows.Count == 0) 4 {//如果没有行被选中,不处理 5 return; 6 } 7 8 //因为DataGridView绑定的数据源是实体对象集合,所以每行绑定了一个实体对象。 9 PhoneNum obj = this.dgvList.CurrentRow.DataBoundItem as PhoneNum; 10 txtCellPhone.Text = obj.Pcellphone; 11 txtHomePhone.Text = obj.Phomephone; 12 txtName.Text = obj.Pname; 13 14 //将pid值存储到控件的TAG值中,这样做方便后面保存时Update 15 this.dgvList.Tag = obj.Pid; 16 //cboGroup.Text = obj.Ptname;//推荐使用下面方式显示Ptname,因为更合理 17 cboGroup.SelectedValue = obj.Ptypeid;//指定SelectedValue,可以自动选中对应ComboBox项 18 }
注意:如果DataGridView绑定的数据源是实体对象集合,那么每行绑定的是一个实体对象。
如果DataGridView绑定的是DataTable,那么每行绑定的是一个DataRowView对象。(现在大家已经很少绑定DataTable了,见下面例子:)
//下面代码是DataGridView绑定的DataTable时。。现在已经很少有人将DataGridView绑定DataTable(而是绑定实体对象集合)。所以下面获取绑定DataRow再转实体的方式,多此一举。 DataRow dataRow = (grid_Step.CurrentRow.DataBoundItem as DataRowView).Row;//获取当前Grid的可视行,绑定的DataRow if (dataRow != null) { Model.PhoneNum phone = _bllPhone.DataRowToModel(dataRow);//通过BLL层调用DAL层方法,将DataRow转为实体对象 //.... }
3、列DataGridViewColumn的子类(详见《第五天 -- 《2014-07-21 三层架构》》第一节)
以DataGridViewComboBoxColumn为例,在DataGridView表格绑定数据源之前,应该先绑定下拉列的数据源。具体方法也可参见下一节“ComboBox的数据绑定”
1 //在DataGridView表格控件绑定数据源之前,先绑定下拉列表列的数据源。如此一来,用户编辑该列时,可以下拉选择可选项。 2 var column = this.dgvList.Columns["cname"] as DataGridViewComboBoxColumn;//注意:表格列名 = 数据库列名 = 实体类属性名。推荐这样的命名方式。必须将列显式转为子类型。 3 if (column != null) 4 { 5 column.DisplayMember = "cname"; //显示值。即绑定实体对象的属性名。 6 column.ValueMember = "cid";//实际值 有更高的优先级,如果同时指定了这两项属性,那么真正的对应字段是ValueMember.以后拿出来进行匹配的就是cid值。与之匹配的也必须是对应类型和意义的字段或者属性名称 7 column.DataSource = cm.GetAllClassesList(false);//BLL层通过DAL层获取实体对象集合——“班级表”的查询结果集 8 column.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;//非编辑时,不显示下拉按钮 9 } 10 11 this.dgvList.DataSource = pm.GetAllPersonList(false);//DataGridView绑定数据源(BLL层从DAL层获取的实体对象集合)
二、ComboBox
1 //在绑定前,最好指定以下属性,CName 和 CID都是实体类属性名 2 cbx_Classes.DisplayMember = "CName"; //显示在下拉列表 3 cbx_Classes.ValueMember = "CID"; //便于选中后取值 4 5 //数据源最好绑定实体对象集合。 6 cbx_Classes.DataSource = _bllClasses.GetAllClassesList();//请求班级的BLL层获取所有班级记录。
注意:每次绑定,都会刷新所有项,所以不像手动Add添加项那样:重新添加之前要先Clear一下。
1 //当cbx_Classes事先绑了数据源,而且指定了ValueMember和DisplayMember属性之后 2 //可以通过SelectedValue指定下拉列表应该选中哪一项 3 4 cbx_Classes.SelectedValue = per.PCID;
2、ComboBox的选中项取值
1 //实例化实体类对象,下面为对象的属性赋值。 2 MODEL.Person newPerson = new MODEL.Person(); 3 4 //一般有两种方式取出下拉列表中的存储的ID号: 5 //1.通过SelectedValue,前提是你之前设置了ValueMenber值。 6 //2.可以通过绑定项SelectedItem。如果数据源是实体集合(如List<>),那么SelectedItem就是实体对象(如果数据源是DataTable,那么SelectedItem就是DataRowView)。 7 newPerson.PCID = (this.cbx_Classes.SelectedItem as MODEL.Classes).Cid; 8 newPerson.PType = (int)cbx_Identity.SelectedValue;
3、ComboBox常订阅的事件
1 //选中索引改变的时候,触发事件 2 this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); 3 4 //选中值改变的时候,触发事件 5 this.comboBox1.SelectedValueChanged += new System.EventHandler(this.comboBox1_SelectedValueChanged);
4、ComboBox数据绑定作多条件查询时,经常需要手动添加一个“请选择” 或 “All”的选项。这个最好在UI层处理。如下:
1 //下拉列表显示所有的班级,用作多条件查询时的一个筛选条件。 2 this.cboSearchClass.DisplayMember = "cname"; 3 this.cboSearchClass.ValueMember = "cid"; 4 List<MODEL.Classes> lists= cm.GetAllClassesList(false); 5 lists.Insert(0, new MODEL.Classes() { Cid = -1, Cname = "请选择" });//手动在最上边插入一个去除该条件的“无效实体对象” 6 this.cboSearchClass.DataSource = lists;//绑定数据源
效果如下:

三、ListView
四、TreeView
浙公网安备 33010602011771号