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 ...
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? –