.net Win窗体DataGridView水平滚动条

.net Win窗体DataGridView水平滚动条,.net,winforms,datagridview,scrollbar,.net,Winforms,Datagridview,Scrollbar,是否可以在Windows Forms 2.0中永久显示DataGridView的水平滚动条。就像我们可以在面板的水平滚动条上做的那样 当前,只有当列的总宽度大于DataGridView宽度时,水平滚动条才可见。但我希望这个滚动条始终可见 感谢您在评论中提到的DataGridView控制其滚动条,如果不需要查看滚动条,则总是希望隐藏滚动条,例如,所有单元格都适合网格的可见区域 然而,有一种方法可以强制DataGridView使用反射显示其滚动条,尽管这是一种黑客行为,我不建议这样做。以下是一个例子

是否可以在Windows Forms 2.0中永久显示DataGridView的水平滚动条。就像我们可以在面板的水平滚动条上做的那样

当前,只有当列的总宽度大于DataGridView宽度时,水平滚动条才可见。但我希望这个滚动条始终可见


感谢您在评论中提到的DataGridView控制其滚动条,如果不需要查看滚动条,则总是希望隐藏滚动条,例如,所有单元格都适合网格的可见区域

然而,有一种方法可以强制DataGridView使用反射显示其滚动条,尽管这是一种黑客行为,我不建议这样做。以下是一个例子:

public Form1()
{
    InitializeComponent();

    // assuming dataGridView1 is a DataGridView control placed on the Form1 form
    PropertyInfo property = dataGridView1.GetType().GetProperty(
        "HorizontalScrollBar", BindingFlags.NonPublic | BindingFlags.Instance);
    if (property != null)
    {
        ScrollBar scrollbar = (ScrollBar)property.GetValue(dataGridView1, null);
        scrollbar.Visible = true;
        scrollbar.VisibleChanged += new EventHandler(ScrollBar_VisibleChanged);
    }
}

void ScrollBar_VisibleChanged(object sender, EventArgs e)
{
    FieldInfo field = dataGridView1.GetType().GetField(
        "layout", BindingFlags.NonPublic | BindingFlags.Instance);
    if (field != null)
    {
        object layoutData = field.GetValue(dataGridView1);
        FieldInfo insideField = layoutData.GetType().GetField(
            "Inside", BindingFlags.Public | BindingFlags.Instance);
        Rectangle rect = (Rectangle)insideField.GetValue(layoutData); 

        ScrollBar scrollBar = (ScrollBar)sender;
        scrollBar.Visible = true;
        scrollBar.SetBounds(
            rect.Left, rect.Height - scrollBar.Height + 1,
            rect.Width, scrollBar.Height);
    }
}

希望这有帮助,请注意

否。ScrollBars属性只允许隐藏它们,而不强制它们显示。计算是否需要滚动条的内部过程过于复杂,无法处理。虚拟列是您唯一的实际选项。虽然它确实显示了滚动条,但它使下方的矩形被隐藏。因此,最后我添加了一个非常长的虚拟字段(冻结),并使H滚动条始终可见。