Winforms 从DataGridView添加/删除行时调整TableLayoutPanel行高

Winforms 从DataGridView添加/删除行时调整TableLayoutPanel行高,winforms,datagridview,tablelayoutpanel,Winforms,Datagridview,Tablelayoutpanel,我有一个包含多行的TableLayoutPanel,其中一些包含TextBox,一些包含DataGridView。我将包含DataGridView的TableLayoutPanel行的SizeType设置为AutoSize。我希望在DataGridView中添加/删除行时,包含它们的行的高度会增加/减少。它没有发生。我是不是误解了这应该怎么做?有没有一种方法可以让它像我期望的那样工作?两位评论者是对的:)事实证明问题在于DataGridView本身。我最终使用了。我构建了一个包含多个选项卡的测试

我有一个包含多行的TableLayoutPanel,其中一些包含TextBox,一些包含DataGridView。我将包含DataGridView的TableLayoutPanel行的SizeType设置为AutoSize。我希望在DataGridView中添加/删除行时,包含它们的行的高度会增加/减少。它没有发生。我是不是误解了这应该怎么做?有没有一种方法可以让它像我期望的那样工作?

两位评论者是对的:)事实证明问题在于DataGridView本身。我最终使用了。我构建了一个包含多个选项卡的测试应用程序,每个选项卡包含一个datagridview和一个添加行的按钮,以及一个删除行的按钮。第一个选项卡只包含这3个组件,我只是想确保它确实能够增长。在第二个选项卡中,我将3个组件放在面板中,Autoscroll设置为true;这也很有效。依此类推,直到我将datagridview和按钮放入TableLayoutPanel(也将Autoscroll设置为true)中的用户控件中。一切都很好。为了防止其他人想要进行实验,只需在每个选项卡上放置两个按钮和一个datagridview,并使用以下代码(以主窗体的形式)对其进行初始化(而不是使用设计器),就可以让事情变得更快

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
设置(dataGridView1、buttonAddRow1、ButtonReveRow1);
设置(dataGridView2、buttonAddRow2、ButtonReveRow2);
设置(dataGridView3、buttonAddRow3、ButtonReveRow3);
设置(dataGridView4,按钮1,按钮2);
设置(userControl11.dataGridView4、userControl11.button1、userControl11.button2);
dataGridView3.MaximumSize=新大小(0,100);
dataGridView4.MaximumSize=新大小(0,100);
}
#区域静态助手
专用静态无效设置(DataGridView网格、按钮添加、按钮删除)
{
BindingList=新建BindingList();
设置网格(网格,列表);
按钮添加。单击+=(发件人,e)=>添加(列表);
按钮删除。单击+=(发件人,e)=>删除(列表);
}
私有静态无效添加(绑定列表)
{
添加(new RowItem(){Name=“Row”+list.Count});
}
私有静态无效删除(BindingList)
{
如果(list.Count>0)
list.RemoveAt(list.Count-1);
}
私有静态void SetupGrid(DataGridView网格、BindingList列表)
{
grid.AutoGenerateColumns=false;
grid.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;
grid.RowHeadersVisible=false;
grid.Columns.Add(CreateTextColumn(“Name”));
grid.DataSource=list;
}
/// 
///将只读设置为true
/// 
/// 
/// 
/// 
/// 
静态公共DataGridViewTextBoxColumn CreateTextColumn(字符串dataPropertyName,字符串columnName=null,字符串格式=null,bool readOnly=true,DataGridViewAutoSizeColumnMode autosizeMode=DataGridViewAutoSizeColumnMode.AllCells,int width=40,DataGridViewColumnSortMode=DataGridViewColumnSortMode.Automatic)
{
DataGridViewTextBoxColumn textColumn=新DataGridViewTextBoxColumn();
textColumn.DataPropertyName=DataPropertyName;
textColumn.Name=String.IsNullOrEmpty(columnName)?dataPropertyName:columnName;
textColumn.ReadOnly=只读;
textColumn.AutoSizeMode=AutoSizeMode;
textColumn.resizeable=DataGridViewTriState.True;
textColumn.Width=宽度;
如果(!String.IsNullOrEmpty(格式))
textColumn.DefaultCellStyle.Format=格式;
textColumn.SortMode=SortMode;
返回文本列;
}
#端域静态辅助程序
}
类行项目
{
公共字符串名称{get;set;}
}

尝试设置
DataGridView.AutoSize=true带有代码(由于某些原因,它不在设计器中)。
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; }
}