强制 DataGridView 填充 SplitContainer 中的可用空间
Posted
技术标签:
【中文标题】强制 DataGridView 填充 SplitContainer 中的可用空间【英文标题】:Forcing DataGridView to fill available space in SplitContainer 【发布时间】:2016-10-17 15:30:22 【问题描述】:我正在编写一个 Windows 窗体应用程序,该应用程序在三个可用区域中的两个区域中使用两个嵌套的 SplitContainer 和 DataGridView,如下图所示。我已经连接了设置和表单初始化,以允许用户禁用多窗格格式,以支持仅包含第一个 DataGridView 的单窗格视图。
这里的主要问题(正如我将在(希望)足够的深度中解释的那样)是,如果其他面板被隐藏,DataGridViews 不遵守 SplitContainer 面板的约束。
这里,红色轮廓表示父SplitContainer,在引用中适当地称为masterSplitContainer
。蓝色轮廓表示子SplitContainer,标题为bottomSplitContainer
,占据masterSplitContainer.Panel2
的位置。
DataGridViews 占据了masterSplitContainer.Panel1
和bottomSplitContainer.Panel1
区域,到目前为止我已经设计了初始化代码,以便程序考虑三种可能性:
-
用户想要单窗格视图/UI布局,从而使
masterSplitContainer.Panel1
占据masterSplitContainer
的整个区域。
用户启用了双窗格布局,但删除了底部容器的 Panel 2。
用户想要所有三个面板。
正如我仅使用 SplitContainers 构建的测试表明的那样,第二个 SplitContainer(孩子)达到了预期的目的,并且对这种安排非常满意,没有任何障碍。但是,当测试启用单窗格视图的设置时,结果如下:
masterSplitContainer.Panel2
被以下代码禁用:
masterSplitContainer.Panel2Collapsed = true;
masterSplitContainer.Panel2.Hide();
在这种情况下,我希望 DataGridView 承担 masterSplitContainer 的完整操作区域,而不是保留其预定义的边界,因为这是我添加部件时面板拆分器所在的位置而设置的。
对于消除过程,放置在子 SplitContainer(即bottomSplitContainer.Panel1
)中的第二个 DataGridView 也会发生同样的事情 - 它也不服从其封闭区域。
到目前为止,我已经对此进行了一些阅读,看起来这可能是一个锚定问题,但我对 .NET 和 Windows 窗体的经验非常有限,所以这可能需要一点点手-持有或指出明显的错误。
另外,如果你们都需要更多实际的代码参考,我很乐意应要求发布表单类。
【问题讨论】:
DGVs Dock=Fill 吗?嵌套的 SpliContainer Dock=Fill 吗? @TaW 进行这两项更改会导致元素按预期执行。 制作一个控制线很简单。提示:通过添加一个或多个固定拆分容器来完成多个相同的操作.. 【参考方案1】:试试这个:
添加以下方法:
public static void DoubleBuffered(this DataGridView dgv, bool setting)
Type dgvType = dgv.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
BindingFlags.Instance | BindingFlags.NonPublic);
if (pi != null) pi.SetValue(dgv, setting, null);
这样称呼:
dataGridView1.DoubleBuffered(true);
dataGridView1 是您拆分面板中的那个。
【讨论】:
以上是关于强制 DataGridView 填充 SplitContainer 中的可用空间的主要内容,如果未能解决你的问题,请参考以下文章
使用 sql 语句从第二个 datagridview 填充 DataGridView