2011-09-26 20 views
5

Użyłem tego http://www.devexpress.com/Support/Center/p/Q233111.aspx (kod jest w VB, więc przekonwertowałem go na C#), aby uzyskać pionowe nagłówki kolumn. Dostaję pionowe nagłówki, ale moim problemem jest to, że niektóre z nich nie pasują, więc nie są w pełni widoczne.Automatyczne wyrównywanie pionowego nagłówka kolumny w języku C# przy użyciu DevXpress

Czy można automatycznie wyrównać nagłówki kolumn? (Wszystkie wysokość ustawiona na wysokości max)

Odpowiedz

4

Jak pokazano na Devexpress support center myślę, że będzie to rozwiązanie problemu Pierwszy dodać klasę pomocnika do rozwiązania

public class AutoHeightHelper 
{ 
    GridView view; 
    public AutoHeightHelper(GridView view) 
    { 
     this.view = view; 
     EnableColumnPanelAutoHeight(); 
    } 

    public void EnableColumnPanelAutoHeight() 
    { 
     SetColumnPanelHeight(); 
     SubscribeToEvents(); 
    } 

    private void SubscribeToEvents() 
    { 
     view.ColumnWidthChanged += OnColumnWidthChanged; 
     view.GridControl.Resize += OnGridControlResize; 
     view.EndSorting += OnGridColumnEndSorting; 
    } 

    void OnGridColumnEndSorting(object sender, EventArgs e) 
    { 
     view.GridControl.BeginInvoke(new MethodInvoker(SetColumnPanelHeight)); 
    } 

    void OnGridControlResize(object sender, EventArgs e) 
    { 
     SetColumnPanelHeight(); 
    } 

    void OnColumnWidthChanged(object sender, DevExpress.XtraGrid.Views.Base.ColumnEventArgs e) 
    { 
     SetColumnPanelHeight(); 
    } 

    private void SetColumnPanelHeight() 
    { 
     GridViewInfo viewInfo = view.GetViewInfo() as GridViewInfo; 
     int height = 0; 
     for (int i = 0; i < view.VisibleColumns.Count; i++) 
      height = Math.Max(GetColumnBestHeight(viewInfo, view.VisibleColumns[i]), height); 
     view.ColumnPanelRowHeight = height; 
    } 

    private int GetColumnBestHeight(GridViewInfo viewInfo, GridColumn column) 
    { 
     GridColumnInfoArgs ex = viewInfo.ColumnsInfo[column]; 
     GraphicsInfo grInfo = new GraphicsInfo(); 
     grInfo.AddGraphics(null); 
     ex.Cache = grInfo.Cache; 
     bool canDrawMore = true; 
     Size captionSize = CalcCaptionTextSize(grInfo.Cache, ex as HeaderObjectInfoArgs, column.GetCaption()); 
     Size res = ex.InnerElements.CalcMinSize(grInfo.Graphics, ref canDrawMore); 
     res.Height = Math.Max(res.Height, captionSize.Height); 
     res.Width += captionSize.Width; 
     res = viewInfo.Painter.ElementsPainter.Column.CalcBoundsByClientRectangle(ex, new Rectangle(Point.Empty, res)).Size; 
     grInfo.ReleaseGraphics(); 
     return res.Height; 
    } 

    Size CalcCaptionTextSize(GraphicsCache cache, HeaderObjectInfoArgs ee, string caption) 
    { 
     Size captionSize = ee.Appearance.CalcTextSize(cache, caption, ee.CaptionRect.Width).ToSize(); 
     captionSize.Height++; captionSize.Width++; 
     return captionSize; 
    } 

    public void DisableColumnPanelAutoHeight() 
    { 
     UnsubscribeFromEvents(); 
    } 

    private void UnsubscribeFromEvents() 
    { 
     view.ColumnWidthChanged -= OnColumnWidthChanged; 
     view.GridControl.Resize -= OnGridControlResize; 
     view.EndSorting -= OnGridColumnEndSorting; 
    } 
} 

Następnie na formularzu należy dokonać Klasa pomocniczy do obsługi kolumny GridView rozmiaru zdarzenia przez dodanie następujących wierszy kodu

AutoHeightHelper helper; 
private void OnFormLoad(object sender, EventArgs e) 
{ 
    helper = new AutoHeightHelper(gridView1); 
    helper.EnableColumnPanelAutoHeight(); 
} 

private void OnFormClosing(object sender, FormClosingEventArgs e) 
{ 
    helper.DisableColumnPanelAutoHeight(); 
} 

nadzieję, że to pomaga ...

+0

I Próbowałem użyć tego rozwiązania i dodałem pozycję menu kontekstowego, gdy kliknę prawym przyciskiem nagłówek kolumny, aby przełączyć, czy używam 'AutoHeightHelper', czy też nie. Kiedy wyłączę 'AutoHeightHelper', wywołuje' UsubscribeFromEvents() ', a wiersz' _view.GridControl.Resize - = OnGridControlResize; 'jest wykonywany. Ale gdy zmieniam rozmiar 'GridControl', to zdarzenie wciąż jest wywoływane i jest obsługiwane przez mojego handler'a. Czy wiesz, dlaczego tak się dzieje? –

Powiązane problemy