2011-09-26 14 views
5

Ho usato questo http://www.devexpress.com/Support/Center/p/Q233111.aspx (il codice è in VB quindi l'ho convertito in C#) per ottenere le intestazioni di colonna verticali. Ottengo le intestazioni verticali ma il mio problema è che alcune di esse non si adattano, quindi non sono completamente visibili.Altezza automatica dell'intestazione di colonna verticale in C# utilizzando DevXpress

È possibile isolare automaticamente le intestazioni di colonna? (Tutto l'altezza impostata altezza massima)

risposta

4

Come mostrato nella Devexpress support center Penso che questa sarà la soluzione al vostro problema prima aggiungere un classe di supporto alla soluzione

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; 
    } 
} 

Poi sul modulo si dovrebbe fare il classe di supporto per gestire le colonne di GridView ridimensionare gli eventi aggiungendo le seguenti righe di codice

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

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

Spero che questo aiuti ...

+0

i Ho provato a utilizzare questa soluzione e ho aggiunto una voce di menu contestuale per quando faccio clic con il pulsante destro del mouse sull'intestazione di una colonna per attivare o disattivare l'utilizzo di AutoHeightHelper. Quando spengo 'AutoHeightHelper', chiama' UsubscribeFromEvents() ', e viene eseguita la riga' _view.GridControl.Resize - = OnGridControlResize; ' Ma quando ridimensiono il 'GridControl', questo evento si attiva e viene gestito dal mio gestore. Sai perché questo potrebbe accadere? –

Problemi correlati