1. 程式人生 > >C#開發學習筆記:向Dev控制元件庫中的GridControl新增自定義複選框

C#開發學習筆記:向Dev控制元件庫中的GridControl新增自定義複選框

<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的RowStateDeleted,Deleted該狀態表示該行不屬於任何表,或則已經從表中分離出去了,不再屬於任何表的DataRow物件。(相當於自由人),不能使用ImprotRow方法,所以使用dt.Rows.Add()方法