2011-04-10 37 views
0

這是我以前的問題is there off-the-shelf convenient way to filter by a group column in XtraGrid GridView?的延續。有沒有一種方便的方法來過濾XtraGrid GridView中的組列而不顯示該列?

我被告知將GridView.OptionsView.ShowGroupedColumns設置爲true,但這只是糟透了。我不想浪費網格中顯示組列的水平空間 - 將它們顯示爲組標題就足夠了。我只想爲頂部的那些列設置漂亮的過濾器文本框。

任何其他建議缺乏滾動我自己?

回答

1

如果相應列未顯示在列標題面板中,則XtraGrid無法在組列後面顯示自動篩選器編輯器。可能的解決方案是在網格附近顯示外部編輯器。還有一個解決方案 - 就是在組列標題的位置顯示編輯器。在這種情況下,您將不得不自己實現篩選和管理編輯器。像這樣:

using DevExpress.XtraGrid.Views.Grid; 
using DevExpress.XtraGrid.Views.Grid.ViewInfo; 
using DevExpress.XtraGrid.Columns; 
using DevExpress.XtraEditors; 
using DevExpress.XtraGrid.Drawing; 
using DevExpress.Data.Filtering; 


     private void gridView1_Click(object sender, EventArgs e) { 
      MouseEventArgs args = e as MouseEventArgs; 
      GridView view = sender as GridView; 
      GridHitInfo hitInfo = view.CalcHitInfo(args.X, args.Y); 
      if(hitInfo.InGroupColumn) { 
       ShowFilterEditor(hitInfo.Column); 
      } 
     } 

     private void ShowFilterEditor(GridColumn gridColumn) { 
      GridView gridView = gridColumn.View as GridView; 
      GridViewInfo vInfo = gridView.GetViewInfo() as GridViewInfo; 
      for(int i = 0; i < vInfo.GroupPanel.Rows.Count; i++) 
       for(int j = 0; j < vInfo.GroupPanel.Rows[i].ColumnsInfo.Count; j ++) { 
        GridColumnInfoArgs columnInfo = vInfo.GroupPanel.Rows[i].ColumnsInfo[gridColumn]; 
        if(columnInfo != null) { 
         Rectangle columnRect = columnInfo.CaptionRect; 
         TextEdit edit = new TextEdit(); 
         gridControl1.Controls.Add(edit); 
         edit.SetBounds(columnRect.Left, columnRect.Top, columnRect.Width, columnRect.Height); 
         edit.Focus(); 
         edit.KeyPress += new KeyPressEventHandler(edit_KeyPress); 
         edit.KeyDown += new KeyEventHandler(edit_KeyDown); 
         edit.Disposed += new EventHandler(edit_Disposed); 
         edit.Tag = gridColumn; 
         return; 
        } 
      } 
     } 

     void edit_Disposed(object sender, EventArgs e) { 
      TextEdit edit = sender as TextEdit; 
      edit.KeyPress -= new KeyPressEventHandler(edit_KeyPress); 
      edit.KeyDown -= new KeyEventHandler(edit_KeyDown); 
      edit.Disposed -= new EventHandler(edit_Disposed); 
      edit.Tag = null; 

     } 

     void edit_KeyDown(object sender, KeyEventArgs e) { 
      if(e.KeyCode == Keys.Return) 
       BeginInvoke(new MethodInvoker(delegate { (sender as TextEdit).Dispose(); })); 
     } 

     void edit_KeyPress(object sender, KeyPressEventArgs e) { 
      BeginInvoke(new MethodInvoker(delegate { 
       TextEdit edit = sender as TextEdit; 
       if(edit.IsDisposed) 
        return; 
       GridColumn column = edit.Tag as GridColumn; 
       column.FilterInfo = new ColumnFilterInfo(new BinaryOperator(column.FieldName, string.Format("%{0}%", edit.Text), BinaryOperatorType.Like)); 
      } 
      )); 
     } 
+0

是的,這就是我的想法:-( – EndangeringSpecies 2011-04-11 18:44:37

相關問題