Ali*_*Tor 5 c# datagridview winforms
我有一种动态创建 DataGridView 的方法,但是当它显示出来时,宽度大于内容宽度(列的总宽度)。高度也没有足够的长度来满足行的长度。
我尝试使用这种方法,但没有奏效:
DataGridView CreateInputBox(int proc, int mac)
{
DataGridView databox = new DataGridView();
for (int i = 0; i < mac; i++)
{
databox.Columns.Add("col" + (i + 1), "M" + (i + 1));
databox.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
databox.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
}
databox.RowTemplate.DefaultHeaderCellType = typeof(CustomHeaderCell);
databox.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
databox.RowHeadersDefaultCellStyle.Padding = new Padding(2);
for (int i = 0; i < proc; i++)
{
databox.Rows.Add();
databox.Rows[i].HeaderCell.Value = "P" + (i + 1);
}
databox.DefaultCellStyle.SelectionBackColor = Color.LightGray;
databox.AllowUserToAddRows = false;
databox.AllowUserToDeleteRows = false;
databox.AllowUserToOrderColumns = false;
databox.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
databox.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
//This block doesn't work
var totalHeight = databox.Rows.GetRowsHeight(DataGridViewElementStates.None);
var totalWidth = databox.Columns.GetColumnsWidth(DataGridViewElementStates.None);
databox.Width = totalWidth;
databox.Height = totalHeight;
//
return databox;
}
public class CustomHeaderCell : DataGridViewRowHeaderCell
{
protected override Size GetPreferredSize(Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex, Size constraintSize)
{
var size1 = base.GetPreferredSize(graphics, cellStyle, rowIndex, constraintSize);
var value = string.Format("{0}", this.DataGridView.Rows[rowIndex].HeaderCell.FormattedValue);
var size2 = TextRenderer.MeasureText(value, cellStyle.Font);
var padding = cellStyle.Padding;
return new Size(size2.Width + padding.Left + padding.Right, size1.Height);
}
protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
{
base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, DataGridViewPaintParts.Background);
base.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle);
TextRenderer.DrawText(graphics, string.Format("{0}", formattedValue), cellStyle.Font, cellBounds, cellStyle.ForeColor);
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
如您所见,DataGridView 控件的宽度如此之长。我怎样才能适应这两个维度?
TaW*_*TaW 12
主要问题是您新创建的DataGridView
在添加到父容器之前尚未完成其内部布局,并且仍将报告所有列的宽度为 100。
修复它的一种方法是在显示 DGV后调用大小调整函数:
void sizeDGV(DataGridView dgv)
{
DataGridViewElementStates states = DataGridViewElementStates.None;
dgv.ScrollBars = ScrollBars.None;
var totalHeight = dgv.Rows.GetRowsHeight(states) + dgv.ColumnHeadersHeight;
totalHeight += dgv.Rows.Count * 4 // a correction I need
var totalWidth = dgv.Columns.GetColumnsWidth(states) + dgv.RowHeadersWidth;
dgv.ClientSize = new Size(totalWidth , totalHeight );
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在此过程中修复了一些问题:
归档时间: |
|
查看次数: |
20045 次 |
最近记录: |