|
很多時(shí)候我們都需要使用DataGridView來做數(shù)據(jù)的顯示,DataGridView是一個(gè)很方便的工具,他可以讓用戶直接在控件里面做數(shù)據(jù)的修改,還可以實(shí)現(xiàn)單表的更新,操作起來很方便。但是如果用戶在做一些操作的時(shí)候可以隨意輸入自己想輸入的值,那就有可能和數(shù)據(jù)中建立的約束不匹配,造成數(shù)據(jù)操作異常。所以我們經(jīng)常會考慮盡量不讓用戶一定數(shù)量做輸入操作,也就是說寧愿讓其選擇也不讓其輸入,這樣又可以減少很多的判斷也可以增加操作的成功性,提高用戶體驗(yàn)的舒適度。這就必然需要去考慮到如果在DataGridView里面顯示類似下拉列表的效果。我們知道,在DataGridView控件的列類型里面有一個(gè)DataGridViewComboBoxColumn,它的效果就類似于我們常用的comboBox了。只不守它是在控件之中的,所以在綁定的時(shí)候需要做一些設(shè)置。下面就以兩個(gè)實(shí)例來說明如果綁定數(shù)據(jù)。 首先我們來做一個(gè)簡單的綁定性別的實(shí)例,效果是這樣:
這里,管理員可以修改用戶的性別,但是如果讓其輸入不僅麻煩而且還容易出錯(cuò),造成數(shù)據(jù)更新錯(cuò)誤。它的實(shí)現(xiàn)方法也很簡單。將DataGridView中需要顯示為下拉列表的列修改類型為DataGridViewComboBoxColumn,然后為其Items設(shè)置相應(yīng)的項(xiàng),如男 女,這樣在常規(guī)的數(shù)據(jù)綁定后就會顯示出上圖的效果了! 但是,我們知道,在數(shù)據(jù)庫里面性別一般會有三種類型,int,bit,char(2),如果這里的性別類型在數(shù)據(jù)庫里面是前面兩種,那么很有可能出現(xiàn)綁定異常:
這是因?yàn)檫@種類型的綁定只能綁定字符串,如果是數(shù)值,那就不行了!當(dāng)然,在控件里面設(shè)置的ITEMS項(xiàng)的值也應(yīng)該和數(shù)據(jù)庫里面的值 完全對應(yīng)才可以。 上面的方法可以實(shí)現(xiàn)一般性的綁定需要,但是只適合項(xiàng)值固定的情況,如性別只可能是男和女,不可能是其它的值。但是如果顯示的值是動(dòng)態(tài)的那剛剛這個(gè)方法顯然是不行的,因?yàn)槟悴豢赡芤驗(yàn)槊恳淮蔚奶砑踊蛘邉h除而修改源文件再重新生成一個(gè)項(xiàng)目吧。所以最好的方式是將這個(gè)DataGridViewComboBoxColumn做 到類似單獨(dú)的comboBox的數(shù)據(jù)綁定效果: string sql = "select subjectid,subjectname from subject"; da = new SqlDataAdapter(sql, DBHelper.connection); da.Fill(ds, "subject"); this.cboSubject.DataSource = ds.Tables["subject"]; this.cboSubject.DisplayMember = "subjectname"; this.cboSubject.ValueMember = "subjectid"; this.cboSubject.SelectedIndex = 0; 不管數(shù)據(jù)庫如何變化,都是顯示數(shù)據(jù)庫的最新更新的值,如下圖 : 為了做到這個(gè)我們需要做以下修改: 常規(guī)的DataGridView數(shù)據(jù)綁定還是一樣,如: 1. DataSet ds = new DataSet(); SqlDataAdapter da; 2. sql = string.Format("select studentname,subjectid,studentresult,examdate from student inner join result on student.studentno=result.studentno where student.studentno='{0}'",studentNo); 3. da.SelectCommand.CommandText = sql; 4. da.Fill(ds,"student"); 5. this.dgvStudentScore.DataSource=ds.Tables["student"]; 為了使DataGridView中的列做到類似comboBox的綁定方式,我們先修改DataGridView列的發(fā)生由DataGridViewTextBoxColumn到DataGridViewComboBoxColumn,之后我們添加了以下代碼: 1. ((DataGridViewComboBoxColumn)this.dgvStudentScore.Columns["subjectid"]).DataSource=ds.Tables["subject"]; 2. ((DataGridViewComboBoxColumn)this.dgvStudentScore.Columns["subjectid"]).DisplayMember = "subjectname"; 3. ((DataGridViewComboBoxColumn)this.dgvStudentScore.Columns["subjectid"]).ValueMember = "subjectid"; 這里,dgvStudentScore是DataGridView控件名,subjectid是控件里面需要?jiǎng)討B(tài)綁定數(shù)據(jù)的列,DataGridViewComboBoxColumn是指這個(gè)列的類型需要強(qiáng)制做一個(gè)轉(zhuǎn)換,不能它還不是一個(gè)真正的ComboBox,也就不能做下拉數(shù)據(jù)的綁定了。 從上面這個(gè)方式可以看到,他的綁定和下拉列表很像,只是需要去獲取到需要做動(dòng)態(tài)綁定的列同時(shí)做一個(gè)類型轉(zhuǎn)換就可以了。 上面還有一個(gè)細(xì)節(jié)就是:在SQL里面只需要讀取到相應(yīng)的ID值(subjectid),同時(shí)在控件里面設(shè)置列的數(shù)據(jù)綁定的時(shí)候也需要將DataPropertyName值設(shè)置為subjectid。 |
|
|