在“隨風飄散” 博客里面,介紹了一個不錯的DataGridView數據窗口控件《DataGridView數據窗口控件開發方法及其源碼提供下載》,這種控件在有些場合下,還是非常直觀的。因為,在一般要求客戶錄入數據的地方,一般有兩種途徑,其一是通過彈出一個新的窗口,在里面列出各種需要輸入的要素,然后保存的,如下圖所示;
其二就是直接在DataGridView中直接輸入。這兩種方式各有優劣,本文介紹采用該控件實現第二種模式的數據數據。如下圖所示
這種方式,直接通過在DataGridView中下拉列表或者文本框中輸入內容,每列的數據可以聯動或者做限制,實現用戶數據的約束及規范化。
控件只要接受了DataTable的DataSource之后,會根據列的HeadText內容,顯示表格的標題及內容,應用還是比較直觀方便的。
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> private void BindGridViewData(DataTable dt, DataTable dtNoRelation) {organTable = dt;noRelationTable = dtNoRelation;DataGridView dataGridView1 = new DataGridView();this.groupBox1.Controls.Clear();this.groupBox1.Controls.Add(dataGridView1);dataGridView1.Dock = DockStyle.Fill;dataGridView1.CellValueChanged +=new DataGridViewCellEventHandler(organDataGridView_CellValueChanged);dataGridView1.UserDeletedRow += new DataGridViewRowEventHandler(organDataGridView_UserDeletedRow);dataGridView1.AutoGenerateColumns = false;dataGridView1.Rows.Clear();dataGridView1.Columns.Clear();DataGridViewDataWindowColumn col1 = new DataGridViewDataWindowColumn();col1.HeaderText = "機構代碼";col1.Name = "機構代碼"; //下拉列表的數據col1.DataSource = GetDataTable(dtNoRelation);dataGridView1.Columns.Add(col1);DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn();col2.HeaderText = "機構名稱";col2.Name = "機構名稱";col2.Width = 300;col2.ReadOnly = true;dataGridView1.Columns.Add(col2);if (dt != null){foreach (DataRow dr in dt.Rows){string value = dr[0].ToString();DataGridViewRow row = new DataGridViewRow();DataGridViewDataWindowCell cell = new DataGridViewDataWindowCell();cell.Value = value;row.Cells.Add(cell);cell.DropDownHeight = 400;cell.DropDownWidth = 300;DataGridViewTextBoxCell cell2 = new DataGridViewTextBoxCell();cell2.Value = dr[1].ToString();row.Cells.Add(cell2);dataGridView1.Rows.Add(row);}}}
由于列之間的數據輸入等相關的影響需要處理,因此控件的處理方式是通過委托函數進行處理,如上面的部分代碼中就是處理這些事件的。
dataGridView1.CellValueChanged +=new DataGridViewCellEventHandler(organDataGridView_CellValueChanged);dataGridView1.UserDeletedRow += new DataGridViewRowEventHandler(organDataGridView_UserDeletedRow);
由于本例子是通過輸入內容后,及時更新數據庫及控件的顯示,因此需要對該事件進行處理,處理代碼如下所示。
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> private void organDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) {DataGridView organDataGridView = sender as DataGridView;if (!organDataGridView.IsCurrentCellInEditMode)return;#region 顯示關聯機構名稱if (e.RowIndex > -1){if (organDataGridView.CurrentCell.Value == System.DBNull.Value){return;}if (e.ColumnIndex == 0){DataGridViewCell cell = organDataGridView.Rows[e.RowIndex].Cells["機構代碼"];if (cell.Value == null)return;string organCode = cell.Value.ToString();string organName = GetOrganName(organTable, organCode);if (string.IsNullOrEmpty(organName)){organName = GetOrganName(noRelationTable, organCode);}organDataGridView.Rows[e.RowIndex].Cells["機構名稱"].Value = organName;}} #endregionif (this.treeView1.SelectedNode != null){string gjOrganCode = this.treeView1.SelectedNode.Tag.ToString();if (!string.IsNullOrEmpty(gjOrganCode)){string yctOrganCode = organDataGridView.CurrentCell.Value.ToString();OrganCodeMapDAL organMapDal = new OrganCodeMapDAL();organMapDal.UpdateOrganMapData(gjOrganCode, yctOrganCode);}}}private void organDataGridView_UserDeletedRow(object sender, DataGridViewRowEventArgs e){DataGridView organDataGridView = sender as DataGridView;string organCode = e.Row.Cells[0].Value.ToString();OrganCodeMapDAL organMapDal = new OrganCodeMapDAL();organMapDal.DeleteOrganMapData(organCode);}
另外,該控件還提供了一個用于對話框窗體中的復雜下拉列表的數據顯示方式,控件支持內容的過濾檢索,非常方便實用,如下所示
該控件的使用代碼如下所示:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> private void BindData() { //設置DataWindow屬性this.dataWindow1.PopupGridAutoSize = false;this.dataWindow1.DropDownHeight = 300;this.dataWindow1.DropDownWidth = 240;this.dataWindow1.FormattingEnabled = true;this.dataWindow1.sDisplayField = "車輛編碼,車牌號碼";this.dataWindow1.sDisplayMember = "車輛編碼";this.dataWindow1.sValueMember = "車輛編碼";this.dataWindow1.SeparatorChar = "|";BusDAL busDal = new BusDAL();DataTable dt = busDal.GetYCTBusTable(this.txtOrganName.Tag.ToString());this.dataWindow1.DataSource = dt;this.dataWindow1.AfterSelector += new EventHandler(dataWindow1_AfterSelector);//必須在DataSource綁定之后設置該屬性this.dataWindow1.RowFilterVisible = true;}//選擇完下拉表格后執行的事件private void dataWindow1_AfterSelector(object sender, EventArgs e){}