標籤:datagridview style class blog code http
記得第一次做機房收費系統的時候,就在添加刪除使用者這出現了點小問題,因為一直都是一個容不得一點瑕疵的人,所以對查詢使用者的時候查詢一次就會多一些空行我很是不能容忍,看似很小的問題,我卻花了很長的時間。現在機房收費系統重構了,又在這塊吹毛求疵了,用了整整兩個小時的時間。解決了好多好多小問題。
(1)為什麼總是顯示第一行資料?
用了SqlHelper查詢到某一層級的使用者返回給U層,就是傳統的三層查詢思想,當時查詢出來後有一點小小的竊喜,但是當添加使用者添加的多了,利用DataGridView怎麼都是只顯示第一行資料。
看看我原來的代碼:
<span style="font-size:14px;">Dim userbll As Bll.UserManager = New Bll.UserManager() Dim dt As New DataTable dt = userbll.SelectLevelUser(user) '現在直接調用B層 DataGridView.AllowUserToAddRows = False '去掉最後一行的空行,每次查詢執行前去掉空行 '將查詢到該層級使用者顯示到DataGridVIew中 If dt.Rows.Count > 0 Then 'DataGridView.Rows(0).Cells("使用者ID").Value = dt.Rows(0)("使用者名稱") 'DataGridView.Rows(0).Cells("使用者名稱").Value = dt.Rows(0)("姓名") 'DataGridView.Rows(0).Cells("開戶人").Value = dt.Rows(0)("開戶人") Else '沒有查到內容時 DataGridView.Rows.Clear() MsgBox("沒有查到記錄!") End If</span>
這兩當dt.Rows.Count > 0 之後說明查詢到使用者記錄,但是不管查到多少條記錄,當datatable返回一個查到的使用者表給U層之後,接下來的代碼就是顯示的第一行的記錄。所以就是在這裡犯了錯誤。看到有些人的部落格就是這樣寫的,可能是因為一開始添加的記錄都比較少吧!
每次DataTable返回來的資料都是查詢到的一個表,而只是把DataTable的第一行的某個自動賦給前面DataGridView的一個列,當資料只有一行的時候這固然沒有錯,但是資料行數多了就會出現錯誤。這是因為沒有一個迴圈或者嵌套把每一行的資料都添加到DataGridView中。
解決方案:利用迴圈嵌套語句,把返回來的datatable表這個的資料分別賦值給DataGridView表。
<span style="font-size:14px;"> If dt.Rows.Count > 0 Then 'DataGridView.Rows(0).Cells("使用者ID").Value = dt.Rows(1)("使用者名稱") 'DataGridView.Rows(0).Cells("使用者名稱").Value = dt.Rows(1)("姓名") 'DataGridView.Rows(0).Cells("開戶人").Value = dt.Rows(1)("開戶人") '查到內容顯示 For i = 0 To dt.Rows.Count - 1 DataGridView.Rows.Add() '一開始沒有行和列,所以要添加一行和一列,避免發生錯誤 For j = 0 To dt.Columns.Count - 1 DataGridView(j, i).Value = dt.Rows(i).Item(j) Next j 'DataGridView.AllowUserToAddRows = False '如果放在這裡,還是會有最後一行 Next i Else DataGridView.Rows.Clear() MsgBox("沒有查到記錄!") End If</span>
(2)為什麼沒點擊一次combo的選項就會多出很多空行?
基本問題是解決了,但是當在點擊一下combo中的管理員層級時,雖然查到的資料是正確的,但是出現了很多空行,讓人心裡不是很舒服。
這是因為每次查詢之前沒有把DataGridView中的行都清理掉,也就是一句代碼而已:
<span style="font-size:14px;">DataGridView.Rows.Clear()</span>
(3)為什麼每次都會顯示最後一行為空白行呢?
問題一個一個的解決,問題也在一個一個的被發現。當大面積的空行去掉了,最後還有一個小尾巴空行。以我的性格是必須把它去掉的。
這是因為DataGridView控制項,使用的都是預設的屬性,這最後的空行就是一個預設屬性,那麼怎樣去掉它呢?
解決方案:
<span style="font-size:14px;">DataGridView.AllowUserToAddRows = False </span>
去掉空行以後,當所有問題都解決後:
(4)DatagridView的其他動作
刪除選中的行,那刪除使用者來說,既要刪除DataGridView表的行同時要刪除資料庫中的資料。
選中DataGridView的多行然後操作
刪除DataGridView的所有行,拿刪除使用者來說:
<span style="font-size:14px;">If intRows > 0 Then For intDelRow = intRows To 1 Step -1 '從下往上刪除,防止漏行 strUserID = DataGridView.SelectedRows(intDelRow - 1).Cells("使用者ID").Value.ToString() '如果該使用者正在工作,則不能刪除 Dim s As String s = FrmLogin.txtUserID.Text() If FrmLogin.txtUserID.Text = strUserID.Trim() Then 'If strUserID.Trim() = FrmLogin.txtUserName.Text Then MsgBox("該使用者正在工作,不能刪除", vbOKOnly + vbExclamation, "提示") Exit Sub Else user.UserID = strUserID '將要刪除的使用者ID傳給實體 intResult = deletebll.DeleteUser(user) '同時將該實體的資訊從資料庫中刪除 'intResult = deletefac.DeleteUser(enUser) If intResult > 0 Then '將資料庫中所刪除的對應的資訊在dataGridView表中也刪除 MsgBox("刪除失敗", vbOKOnly + vbExclamation, "提示") Else DataGridView.Rows.RemoveAt(DataGridView.SelectedRows(intDelRow - 1).Index) MsgBox("刪除成功", vbOKOnly + vbExclamation, "提示") End If End If Next Else DataGridView.Rows.Clear() End If</span>
(5)DataGridView的其它常用操作:
例如:取得當前單元格的行的索引,從0開始
(dataGridView1.CurrentCell.RowIndex).ToString()
行列的隱藏:
// DataGridView1的第一列隱藏DataGridView1.Columns[0].Visible = false;// DataGridView1的第一行隱藏DataGridView1.Rows[0].Visible = false;
這隻是我的關於DataGridView目前操作的理解,還有很多對DataGridView的常用用法:
http://blog.sina.com.cn/s/blog_97b9841901011u0u.html
http://www.cnblogs.com/wintalen/archive/2010/12/13/1904536.html
小結:在機房收費系統重構的時候會經常使用到DataGridView控制項,所以掌握好一個控制項的使用方法很重要,它相當於一個承載了我們需要可視給使用者的一個籃子,將需要查詢的資料顯示在這個籃子上,讓使用者很清晰的明了資訊,並且很方便的進行對資料的操作。