c#開發_Dev的關於XtraGrid的使用(GridControl小結)_Second


對Dev的關於XtraGrid的使用第一使用的鏈接:http://www.cnblogs.com/stephen-vv/archive/2012/12/18/2822800.html

 

接着說,GirdControl如何定位和查找指定列顯示值的行(注意是列的實顯示值,而不是關聯數據源列值)

下面請看代碼:

using DevExpress.XtraGrid.Views.Base;
 using DevExpress.XtraGrid.Columns;
 // ...
  
 string searchText = "Japan";
 // obtaining the focused view
 ColumnView view = (ColumnView)gridControl1.FocusedView;
 // obtaining the column bound to the Country field
 GridColumn column = view.Columns["Country"];
 if(column != null) {
 // locating the row
 //如果用數據源中的列值,請用ColumnView.LocateByValue
     int rhFound = view.LocateByDisplayText(view.FocusedRowHandle + 1, column, searchText);
     // focusing the cell
     if(rhFound != GridControl.InvalidRowHandle) {
         view.FocusedRowHandle = rhFound;
         view.FocusedColumn = column;
     }
 }
 

另一個查找示例

 DevExpress.XtraGrid.Views.Base.ColumnView view = gridControl1.MainView as DevExpress.XtraGrid.Views.Base.ColumnView;
 view.BeginUpdate();
 try {
    int rowHandle = 0;
    DevExpress.XtraGrid.Columns.GridColumn col = view.Columns["Category"];
    while(true) {
       // locating the next row
       rowHandle = view.LocateByValue(rowHandle, col, "SPORTS");
       // exiting the loop if no row is found
       if (rowHandle == DevExpress.XtraGrid.GridControl.InvalidRowHandle)
          break;
       // perform specific operations on the row found here
       // ...
       rowHandle++;
    }
 } 
finally {
view.EndUpdate();
}

將特定編輯框綁定到列
默認的cell編輯框是不可以改變的,即使是在運行時,因為它們是動態創建和注銷的。
要想定制,就在設計時修改ColumnEdit吧。

using DevExpress.XtraEditors.Repository;
  
 //Create a repository item for a combo box editor 
 RepositoryItemComboBox riCombo = new RepositoryItemComboBox();
 riCombo.Items.AddRange(new string[] {"London", "Berlin", "Paris"});
 //Add the item to the internal repository
 gridControl1.RepositoryItems.Add(riCombo);
 //Now you can define the repository item as an in-place column editor
 colCity.ColumnEdit =  riCombo;
 

另一個運行時綁定列編輯框示例

private void gridView1_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e) {
    if (e.Column.FieldName == "FieldName") return;
    DevExpress.XtraGrid.Views.Grid.GridView gv = sender as DevExpress.XtraGrid.Views.Grid.GridView;
    string fieldName = gv.GetRowCellValue(e.RowHandle, gv.Columns["FieldName"]).ToString();
    switch (fieldName) {
       case "Population":
          e.RepositoryItem = repositoryItemSpinEdit1;
          break;
       case "Country":
          e.RepositoryItem = repositoryItemComboBox1;
          break;
       case "Capital":
          e.RepositoryItem = repositoryItemCheckEdit1;
          break;
    }           
 }
 

檢驗錄入數據是否有效

using DevExpress.XtraGrid.Views.Grid;
 using DevExpress.XtraGrid.Columns;
  
 public bool isValidDate(int day, int month, int year) {
     return (day > 0) && (month > 0) && (month <= 12) && (year > 1980) && (year < 2100) && (day <= DateTime.DaysInMonth(year, month));
 }
  
 private void gridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e) {
     GridView view = sender as GridView;
     GridColumn colDay = view.Columns["Day"];
     GridColumn colMonth = view.Columns["Month"];
     GridColumn colYear = view.Columns["Year"];
     int day = (int)view.GetRowCellValue(e.RowHandle, colDay);
     int month = (int)view.GetRowCellValue(e.RowHandle, colMonth);
     int year = (int)view.GetRowCellValue(e.RowHandle, colYear);
     e.Valid = isValidDate(day, month, year);
     if(!e.Valid) {
         view.SetColumnError(colDay, "Check the day");
         view.SetColumnError(colMonth, "Check the month");
         view.SetColumnError(colYear, "Check the year");
     }
 }
 

MouseMove捕捉

 

private void Grid_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
   { 
   ShowHitInfo(this.gridView1.CalcHitInfo(new Point(e.X, e.Y))); 
   } 
   private void ShowHitInfo(DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hi) 
   { 
    DevExpress.XtraGrid.Views.Base.ColumnView cgv = 
     (DevExpress.XtraGrid.Views.Base.ColumnView)Grid.MainView; 
    string columnName = hi.Column == null ? "No column" : hi.Column.Caption; 
    switch(columnName) 
    { 
     case "賬號": 
      txtUserName.Text = cgv.GetRowCellDisplayText(hi.RowHandle,hi.Column); 
      break; 
     case "密碼": 
      txtPassword.Text = cgv.GetRowCellDisplayText(hi.RowHandle,hi.Column); 
      break; 
     case "真實姓名": 
      txtRealName.Text = cgv.GetRowCellDisplayText(hi.RowHandle,hi.Column); 
      break; 
     case "電子郵件": 
      txtEmail.Text = cgv.GetRowCellDisplayText(hi.RowHandle,hi.Column); 
      break; 
     case "角色": 
      cbRole.Text = cgv.GetRowCellDisplayText(hi.RowHandle,hi.Column); 
      break; 
     default: 
      txtUserName.Text = "Null"; 
      txtPassword.Text = "Null"; 
      txtRealName.Text = "Null"; 
      txtEmail.Text = "Null"; 
      cbRole.Text = "Null"; 
      break; 
    }
 

 

主從表的設置

DataTable dt = pb.GetItemInfoList(Port).Copy(); //返回一個TABLE
             dt.TableName = "ItemInfo";
             ds.Tables.Add(dt);
             DataTable dt2 = pb.GetBuildingInfoList(Port).Copy(); //返回一個TABLE
             dt2.TableName = "BuildingInfo";
             ds.Tables.Add(dt2);
             DataColumn keyColumn = ds.Tables["ItemInfo"].Columns["ITEMINFO_ID"];
             DataColumn foreignKeyColumn = ds.Tables["BuildingInfo"].Columns["ITEMINFOID"];
             ds.Relations.Add("itembuildinginfo", keyColumn, foreignKeyColumn);
             gridControl1.DataSource = ds.Tables["ItemInfo"];
 

獲取從表的當前選擇行的某一列(如ID列)
     這個時候再使用獲取主表當前選擇行的某一列的方法是不行的,因為所得到的seletedrowscount=0。使用如下方法得到:
  在MASTER表的展開事件中得到detail有的view.然后就可以利用它了。例:

//主表的masterrowexpanded事件 
 private void gridView1_MasterRowExpanded(object sender, DevExpress.XtraGrid.Views.Grid.CustomMasterRowEventArgs e)
         {
             detailView = gridView1.GetDetailView(e.RowHandle, e.RelationIndex) as DevExpress.XtraGrid.Views.Grid.GridView;
         }
  
 //取得從表的當前行
 int[] i = detailView.GetSelectedRows();
             DataRowView dt = (DataRowView)detailView.GetRow(i[0]);
  
 //獲得當前行某列的值可以使用
 
 dt["列名"].ToString();
 
 //獲得當那個列的值。
 

定義焦點行的方法:

gridView_bcode.FocusedRowHandle = focuseRowInt; //通過設置GridView 的FocusedRowHandle屬性 
  
 //獲取焦點行任意單元格的數據    
 ColumnView cv = (ColumnView)gridControl_Gongzi.FocusedView;//重新獲取此ID 否則無法從表頭連刪獲取不到id   
                         int focusedhandle = cv.FocusedRowHandle;   
                         object rowIdObj = gridView1.GetRowCellValue(focusedhandle, "id");   
                         if (DBNull.Value != rowIdObj)   
                         {   
                             FocusedRow_id = Convert.ToInt32(rowIdObj);   
                         }  
 //獲取焦點行任意單元格的數據 
 ColumnView cv = (ColumnView)gridControl_Gongzi.FocusedView;//重新獲取此ID 否則無法從表頭連刪獲取不到id
                         int focusedhandle = cv.FocusedRowHandle;
                         object rowIdObj = gridView1.GetRowCellValue(focusedhandle, "id");
                         if (DBNull.Value != rowIdObj)
                         {
                             FocusedRow_id = Convert.ToInt32(rowIdObj);
                         }
  view plaincopy to clipboardprint?
 //當數據發生變化時執行    
      private void gridView1_CellValueChanged(object sender, CellValueChangedEventArgs e)   
      {   
          int intRowHandle = e.RowHandle;   
          FocusedRow_bumen = Convert.ToString(gridView1.GetRowCellValue(intRowHandle, "bumen"));   
          FocusedRow_xingming = Convert.ToString(gridView1.GetRowCellValue(intRowHandle, "xingming"));   
          //FocusedRow_jibengongzi = Convert.ToDecimal(gridView1.GetRowCellValue(intRowHandle, "jibengongzi"));   
          object rowJibengongziObj = gridView1.GetRowCellValue(intRowHandle, "jibengongzi");   
          if (DBNull.Value != rowJibengongziObj)   
          {   
              FocusedRow_jibengongzi = Convert.ToDecimal(rowJibengongziObj);   
          }   
       }  
    //當數據發生變化時執行 
         private void gridView1_CellValueChanged(object sender, CellValueChangedEventArgs e)
         {
             int intRowHandle = e.RowHandle;
             FocusedRow_bumen = Convert.ToString(gridView1.GetRowCellValue(intRowHandle, "bumen"));
             FocusedRow_xingming = Convert.ToString(gridView1.GetRowCellValue(intRowHandle, "xingming"));
             //FocusedRow_jibengongzi = Convert.ToDecimal(gridView1.GetRowCellValue(intRowHandle, "jibengongzi"));
             object rowJibengongziObj = gridView1.GetRowCellValue(intRowHandle, "jibengongzi");
             if (DBNull.Value != rowJibengongziObj)
             {
                 FocusedRow_jibengongzi = Convert.ToDecimal(rowJibengongziObj);
             }
          } view plaincopy to clipboardprint?
 //設置焦點行的焦點單元格的位置   
 ColumnView view = (ColumnView)gridControl_Gongzi.FocusedView;   
 view.FocusedColumn = view.Columns["bumen"];  
 //設置焦點行的焦點單元格的位置
 ColumnView view = (ColumnView)gridControl_Gongzi.FocusedView;
 view.FocusedColumn = view.Columns["bumen"]; view plaincopy to clipboardprint?
 //當焦點行發生改變時執行 獲取選中焦點行id   
        private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)   
        {   
            int intRowHandle = e.FocusedRowHandle;   
   
            object rowIdObj = gridView1.GetRowCellValue(intRowHandle, "id");   
   
            if (DBNull.Value != rowIdObj)//做個判斷否則獲取不到id后報錯   
            {   
                FocusedRow_id = Convert.ToInt32(rowIdObj);   
            }   
        }  
  //當焦點行發生改變時執行 獲取選中焦點行id
         private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
         {
             int intRowHandle = e.FocusedRowHandle;
  
             object rowIdObj = gridView1.GetRowCellValue(intRowHandle, "id");
  
             if (DBNull.Value != rowIdObj)//做個判斷否則獲取不到id后報錯
             {
                 FocusedRow_id = Convert.ToInt32(rowIdObj);
             }
         }   
  
  view plaincopy to clipboardprint?
 //焦點行的FocusedHandle為:   
  FocuseRow_Handle = -999998;   
 //獲取焦點行的handle   
 ColumnView newview = (ColumnView)gridControl_Gongzi.FocusedView;   
   
                         FocuseRow_Handle = newview.FocusedRowHandle;   
 //回車添加新行   
   代碼 
   private void gridView1_KeyPress(object sender, KeyPressEventArgs e)   
            
         {   
             if (e.KeyChar == 13)   
             {   
                 ColumnView view = (ColumnView)gridControl_Gongzi.FocusedView;   
                 if(view.IsLastRow)   
                 {   
                     if (FocuseRow_Handle == 0)   
                     {   
                         gridView1.AddNewRow();   
                            
                         ColumnView newview = (ColumnView)gridControl_Gongzi.FocusedView;   
                            
                         newview.FocusedColumn = newview.Columns["bumen"];//定位焦點網格的位置   
                            
                         FocuseRow_Handle = newview.FocusedRowHandle;//獲取新焦點行的FocuseRowHandle 並初始化全局變量FocuseRow_Handle供保存操作時判斷是upd                                                                       ate還是insert    
                     }
 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM