我无法将 ComboBox 停靠在 TableLayoutPanel 单元格中

Posted

技术标签:

【中文标题】我无法将 ComboBox 停靠在 TableLayoutPanel 单元格中【英文标题】:I am unable to dock a ComboBox in a TableLayoutPanel cell 【发布时间】:2021-04-06 19:20:48 【问题描述】:

请看下图:我想将 ComboxBox 控件停靠在我的 TableLayoutPanel 的单元格中。

ComboBox Dock 属性设置为FillAnchor 属性设置为top,bottom,left,right

【问题讨论】:

ComboBox 高度基于字体高度,无论你如何停靠它。顺便说一句,当您停靠控件时,您设置的锚点变得无关紧要。也许您想根据内容自动调整 TableLayoutPanel 的单元格大小? 先生,感谢您的回答。不,我只是想将组合框停靠到我的表格单元格 【参考方案1】:

TL;博士

这是预期行为,因为 ComboBoxDock 设置为 Fill 不会填充容器。它的高度是根据它的Font 高度计算的,或者对于一个基于其ItemHeight 的所有者绘制的组合框。

如果您确实有必要更改行为,您可以通过覆盖其SetBoundsCore 方法来破解该行为。


长答案 - 支持 Dock = Fill 的 ComboBox

ComboBox 的高度由以下规则控制:

如果控件的DrawMode是Normal,那么高度将基于Font.Height 如果控件的DrawMode 是 OwnerDraw,那么高度将基于ItemHeight

所以它不支持 Docking-Fill。

但是你可以破解这种行为;您可以从ComboBox 派生并通过覆盖SetBoundsCore 来更改行为:

using System.Windows.Forms;
public class MyComboBox : ComboBox

    public MyComboBox()
    
        DrawMode = DrawMode.OwnerDrawFixed;
    
    protected override void SetBoundsCore(
        int x, int y, int width, int height, BoundsSpecified specified)
    
        base.SetBoundsCore(x, y, width, height, specified);
        if (Dock == DockStyle.Fill ||
            Dock == DockStyle.Left ||
            Dock == DockStyle.Right)
        
            var d = SystemInformation.FixedFrameBorderSize.Height;
            ItemHeight = height - 2 * d;
        
        else
        
            ItemHeight = FontHeight + 2;
        
    
    protected override void OnDrawItem(DrawItemEventArgs e)
    
        e.DrawBackground();
        var text = e.Index >= 0 ? GetItemText(e.Index) : string.Empty;
        TextRenderer.DrawText(e.Graphics, text, e.Font, e.Bounds, e.ForeColor,
            TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
        base.OnDrawItem(e);
    

结果:

【讨论】:

这篇文章能回答你的问题吗?【参考方案2】:

正如已经建议的那样,您不能使用锚点或停靠属性更改组合框和文本框的高度。您可以在 Font 属性中更改字体大小。默认为 8.25pt。

Like Here

【讨论】:

以上是关于我无法将 ComboBox 停靠在 TableLayoutPanel 单元格中的主要内容,如果未能解决你的问题,请参考以下文章

在 WinForms 中修改停靠布局

无法更改停靠小部件填充

当其父级是面板时,ComboBox无法正常工作

我可以像停靠在键盘上一样将 UIToolbar 停靠在 UIPickerview 上吗

jQuery ComboBox:无论我尝试啥,我都无法将值返回到我的选择框(无法以编程方式选择所需的选项)

如何将 ComboBox 添加到 TreeView 列?