当来自 DataGridView 的行 added/removed 时调整 TableLayoutPanel 行高
Adjusting TableLayoutPanel Row height when rows added/removed from DataGridView
我有一个包含多行的 TableLayoutPanel,其中一些包含 TextBox,一些包含 DataGridView。我将包含 DataGridView 的 TableLayoutPanel 行的 SizeType 设置为 AutoSize。我希望因为来自 DataGridView 的行 added/removed,所以包含它们的行的高度会 increase/decrease。它没有发生。我误解了这应该如何工作吗?有没有办法让它按我预期的方式工作?
两位评论者是对的 :) 结果证明问题出在 DataGridView 本身。我最终使用了 。我构建了一个包含多个选项卡的测试应用程序,每个选项卡包含一个 datagridview 和一个用于添加行的按钮,以及一个用于删除行的按钮。第一个选项卡只包含这 3 个组件,我只是想确保它确实可以增长。在第二个选项卡中,我将 3 个组件放在一个 Panel 中,并将 Autoscroll 设置为 true;那也很好用。依此类推,直到我将 datagridview 和按钮放在用户控件内的 TableLayoutPanel(也将 Autoscroll 设置为 true)内。一切正常。以防万一其他人想要试验,只需在每个选项卡上放置 2 个按钮和一个 datagridview 并使用以下代码(在主窗体中)初始化它们(而不是使用设计器),事情就会变得更快。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Setup(dataGridView1, buttonAddRow1, buttonRemoveRow1);
Setup(dataGridView2, buttonAddRow2, buttonRemoveRow2);
Setup(dataGridView3, buttonAddRow3, buttonRemoveRow3);
Setup(dataGridView4, button1, button2);
Setup(userControl11.dataGridView4, userControl11.button1, userControl11.button2);
dataGridView3.MaximumSize = new Size(0, 100);
dataGridView4.MaximumSize = new Size(0, 100);
}
#region static helpers
private static void Setup(DataGridView grid, Button buttonAdd, Button buttonRemove)
{
BindingList<RowItem> list = new BindingList<RowItem>();
SetupGrid(grid, list);
buttonAdd.Click += (sender, e) => Add(list);
buttonRemove.Click += (sender, e) => Remove(list);
}
private static void Add(BindingList<RowItem> list)
{
list.Add(new RowItem() { Name = "Row " + list.Count });
}
private static void Remove(BindingList<RowItem> list)
{
if (list.Count > 0)
list.RemoveAt(list.Count - 1);
}
private static void SetupGrid(DataGridView grid, BindingList<RowItem> list)
{
grid.AutoGenerateColumns = false;
grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.RowHeadersVisible = false;
grid.Columns.Add(CreateTextColumn("Name"));
grid.DataSource = list;
}
/// <summary>
/// Sets read-only to true
/// </summary>
/// <param name="dataPropertyName"></param>
/// <param name="format"></param>
/// <param name="columnName"></param>
/// <returns></returns>
static public DataGridViewTextBoxColumn CreateTextColumn(string dataPropertyName, string columnName = null, string format = null, bool readOnly = true, DataGridViewAutoSizeColumnMode autosizeMode = DataGridViewAutoSizeColumnMode.AllCells, int width = 40, DataGridViewColumnSortMode sortMode = DataGridViewColumnSortMode.Automatic)
{
DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
textColumn.DataPropertyName = dataPropertyName;
textColumn.Name = String.IsNullOrEmpty(columnName) ? dataPropertyName : columnName;
textColumn.ReadOnly = readOnly;
textColumn.AutoSizeMode = autosizeMode;
textColumn.Resizable = DataGridViewTriState.True;
textColumn.Width = width;
if (!String.IsNullOrEmpty(format))
textColumn.DefaultCellStyle.Format = format;
textColumn.SortMode = sortMode;
return textColumn;
}
#endregion static helpers
}
class RowItem
{
public string Name { get; set; }
}
我有一个包含多行的 TableLayoutPanel,其中一些包含 TextBox,一些包含 DataGridView。我将包含 DataGridView 的 TableLayoutPanel 行的 SizeType 设置为 AutoSize。我希望因为来自 DataGridView 的行 added/removed,所以包含它们的行的高度会 increase/decrease。它没有发生。我误解了这应该如何工作吗?有没有办法让它按我预期的方式工作?
两位评论者是对的 :) 结果证明问题出在 DataGridView 本身。我最终使用了
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Setup(dataGridView1, buttonAddRow1, buttonRemoveRow1);
Setup(dataGridView2, buttonAddRow2, buttonRemoveRow2);
Setup(dataGridView3, buttonAddRow3, buttonRemoveRow3);
Setup(dataGridView4, button1, button2);
Setup(userControl11.dataGridView4, userControl11.button1, userControl11.button2);
dataGridView3.MaximumSize = new Size(0, 100);
dataGridView4.MaximumSize = new Size(0, 100);
}
#region static helpers
private static void Setup(DataGridView grid, Button buttonAdd, Button buttonRemove)
{
BindingList<RowItem> list = new BindingList<RowItem>();
SetupGrid(grid, list);
buttonAdd.Click += (sender, e) => Add(list);
buttonRemove.Click += (sender, e) => Remove(list);
}
private static void Add(BindingList<RowItem> list)
{
list.Add(new RowItem() { Name = "Row " + list.Count });
}
private static void Remove(BindingList<RowItem> list)
{
if (list.Count > 0)
list.RemoveAt(list.Count - 1);
}
private static void SetupGrid(DataGridView grid, BindingList<RowItem> list)
{
grid.AutoGenerateColumns = false;
grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
grid.RowHeadersVisible = false;
grid.Columns.Add(CreateTextColumn("Name"));
grid.DataSource = list;
}
/// <summary>
/// Sets read-only to true
/// </summary>
/// <param name="dataPropertyName"></param>
/// <param name="format"></param>
/// <param name="columnName"></param>
/// <returns></returns>
static public DataGridViewTextBoxColumn CreateTextColumn(string dataPropertyName, string columnName = null, string format = null, bool readOnly = true, DataGridViewAutoSizeColumnMode autosizeMode = DataGridViewAutoSizeColumnMode.AllCells, int width = 40, DataGridViewColumnSortMode sortMode = DataGridViewColumnSortMode.Automatic)
{
DataGridViewTextBoxColumn textColumn = new DataGridViewTextBoxColumn();
textColumn.DataPropertyName = dataPropertyName;
textColumn.Name = String.IsNullOrEmpty(columnName) ? dataPropertyName : columnName;
textColumn.ReadOnly = readOnly;
textColumn.AutoSizeMode = autosizeMode;
textColumn.Resizable = DataGridViewTriState.True;
textColumn.Width = width;
if (!String.IsNullOrEmpty(format))
textColumn.DefaultCellStyle.Format = format;
textColumn.SortMode = sortMode;
return textColumn;
}
#endregion static helpers
}
class RowItem
{
public string Name { get; set; }
}