C#開發學習筆記:向Dev控制元件庫中的GridControl新增自定義複選框
阿新 • • 發佈:2019-02-18
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Dev控制元件庫自帶的有複選框列,預設是不顯示狀態,如果需要則設定相關的兩個屬性:</span><pre name="code" class="csharp"><span> </span>//設定grid顯示選擇列 gridview.OptionsSelection.MultiSelect = true; gridview.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect;
向Dev控制元件庫中的GridControl新增自定義複選框
1.用程式碼新增:
//設定grid資料行可以多選 gridview.OptionsSelection.MultiSelect = true;//設定資料行可以多行選擇 gridview.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect;//設定選中一整行 DevExpress.XtraGrid.Columns.GridColumn col = new DevExpress.XtraGrid.Columns.GridColumn(); col.FieldName = "Selection"; col.Caption = "選擇"; col.VisibleIndex = 0;//設定列顯示順序,0表示顯示為第一列 col.SortMode = DevExpress.XtraGrid.ColumnSortMode.Value; col.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric; col.ColumnEdit = new RepositoryItemCheckEdit() //繫結該列為複選框列(checkedit控制元件) { NullStyle=DevExpress.XtraEditors.Controls.StyleIndeterminate.Unchecked,//設定未選中時,複選框的樣子 ValueChecked ="True",//設定選中時的value值 ValueUnchecked = "False"//設定未選中時value的值 }; col.UnboundType = DevExpress.Data.UnboundColumnType.Boolean;//設定資料繫結的型別為boolean型別 col.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near; gridview.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;//設定列標題居中 gridview.Columns.Add(col); col.AbsoluteIndex = 0;//由於資料來源有隱藏列(會導致列重新排序),所以需要設定該屬性為0(將新增的設定為第一列) DataTable dt = new DataTable(); foreach (DevExpress.XtraGrid.Columns.GridColumn item in gridview.Columns) { if (item.Caption == "選擇") { dt.Columns.Add(item.FieldName); break; } } <span style="white-space:pre"> </span>//將dt與資料來源合併(相當於將複選框列填加到資料來源) ds.Tables[0].Merge(dt); gridcontrol.DataSource = ds.Tables[0];
在新增列時,遇見了選中複選框後,滑鼠焦點移到其他cell時,複選框狀態又還原為未選中狀態(一開始未繫結資料來源),查詢資料之後添加了繫結複選框列;到資料來源的程式碼,測試時問題依然存在,後來發現原因為在繫結列為複選框時,沒有繫結ValueChecked 和ValueUnchecked的值 (這兩個值我繫結的為String型別,用Run Designer新增列自動為Boolean型別,不知道是否為版本原因(我使用的是15.2.10,其他人使用的是低版本),其他人不修改這兩個屬性的值型別為String也不會出現上述問題,而我的卻會出現)
2,直接使用Grid的Run Designer新增3.當cell的值改變時設定複選框為選中狀態
<span style="white-space:pre"> </span>private void gridView1_CellValueChanging(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
{
gridView1.SetRowCellValue(e.RowHandle,gridView1.Columns.ColumnByFieldName("Selection"), "True");
}
4.獲取Grid中新增的選中的資料
DataTable dt = new DataTable();
DataTable result_dt = new DataTable();
try
{
int[] RowHandle = gridview.GetSelectedRows();
dt=gridview.GetFocusedDataRow().Table;
result_dt.Merge(gridview.GetFocusedDataRow().Table);
result_dt.Clear();
//將新增的資料行新增到dt資料表
for (int i = 0; i < RowHandle.Count(); i++)
{
if (gridview.GetDataRow(RowHandle[i]) != null)
dt.Rows.Add(gridview.GetDataRow(RowHandle[i]));
}
//將選中的資料過濾出來(通過新增的選擇列過濾)
foreach (DataRow dr in dt.Rows)
{
if(dr["Selection"]=="True")
result_dt.ImportRow(dr);
}
}
一開始使用的獲取資料行的程式碼是DataRow dr = gridview.GetFocusedDataRow();這樣確實可以獲取到資料行(只針對一行資料而言,如果是新增多行資料,則使用上面的方法),但是在使用dt.ImportRow(dr)時發現dr並沒有新增到表中,原因是dr的RowState為Deleted,而Deleted該狀態表示該行不屬於任何表,或則已經從表中分離出去了,不再屬於任何表的DataRow物件。(相當於自由人),不能使用ImprotRow方法,所以使用dt.Rows.Add()方法