2011-09-26 33 views
5

Tôi đã sử dụng mã này http://www.devexpress.com/Support/Center/p/Q233111.aspx (mã trong VB vì vậy tôi đã chuyển đổi nó thành C#) để nhận tiêu đề cột dọc. Tôi nhận được các tiêu đề dọc nhưng vấn đề của tôi là một số trong số họ không phù hợp, vì vậy họ không hoàn toàn có thể nhìn thấy.Autoheight của tiêu đề cột dọc trong C# bằng cách sử dụng DevXpress

Có thể tự động phát hiện tiêu đề cột không? (Tất cả chiều cao thiết lập để chiều cao tối đa)

Trả lời

4

Như đã trình bày trong Devexpress support center tôi nghĩ rằng đây sẽ là giải pháp cho vấn đề của bạn Đầu tiên thêm một lớp helper để giải pháp của bạn

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

Sau đó vào mẫu của bạn, bạn nên làm cho lớp helper để xử lý cột GridView của thay đổi kích thước các sự kiện bằng cách thêm các dòng mã sau đây

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

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

Hope this helps ...

+0

tôi đã cố gắng sử dụng giải pháp này và tôi đã thêm một mục menu ngữ cảnh cho khi tôi nhấp chuột phải vào tiêu đề cột để chuyển đổi cho dù tôi đang sử dụng 'AutoHeightHelper' hay không. Khi tôi tắt 'AutoHeightHelper', nó gọi' UsubscribeFromEvents() ', và dòng' _view.GridControl.Resize - = OnGridControlResize; 'được thi hành. Nhưng khi tôi thay đổi kích thước 'GridControl', sự kiện này vẫn còn cháy và được xử lý bởi trình xử lý của tôi. Bạn có biết tại sao điều này có thể xảy ra không? –