.net Win窗体DataGridView水平滚动条
是否可以在Windows Forms 2.0中永久显示DataGridView的水平滚动条。就像我们可以在面板的水平滚动条上做的那样 当前,只有当列的总宽度大于DataGridView宽度时,水平滚动条才可见。但我希望这个滚动条始终可见.net Win窗体DataGridView水平滚动条,.net,winforms,datagridview,scrollbar,.net,Winforms,Datagridview,Scrollbar,是否可以在Windows Forms 2.0中永久显示DataGridView的水平滚动条。就像我们可以在面板的水平滚动条上做的那样 当前,只有当列的总宽度大于DataGridView宽度时,水平滚动条才可见。但我希望这个滚动条始终可见 感谢您在评论中提到的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滚动条始终可见。