1

我正在编写一个 Windows 窗体应用程序,该应用程序在三个可用区域中的两个区域中使用两个嵌套的 SplitContainers 和 DataGridViews,如下图所示。我已经连接了设置和表单初始化,以允许用户禁用多窗格格式,以支持仅包含第一个 DataGridView 的单窗格视图。

这里的主要问题(正如我将在(希望)足够的深度中解释的那样)是,如果其他面板被隐藏,DataGridViews 不遵守 SplitContainer 面板的约束。

DataGridView/SplitContainer 布局

在这里,红色轮廓表示父 SplitContainer,masterSplitContainer在引用中适当地调用。蓝色轮廓表示子 SplitContainer,标题为bottomSplitContainer,占据该masterSplitContainer.Panel2位置。

DataGridViews 占据masterSplitContainer.Panel1bottomSplitContainer.Panel1区域,到目前为止我已经设计了初始化代码,以便程序考虑三种可能性:

  1. 用户想要一个仅单窗格的视图/UI 布局,从而masterSplitContainer.Panel1占用masterSplitContainer.
  2. 用户启用双窗格布局,但删除了底部容器的 Panel 2
  3. 用户想要所有三个面板。

正如我仅使用 SplitContainers 构建的测试所表明的那样,第二个 SplitContainer(孩子)得到了预期的点,并且对这种安排非常满意,没有任何障碍。但是,当测试启用单窗格视图的设置时,结果如下:

DataGridView 问题 1

使用以下masterSplitContainer.Panel2代码禁用:

masterSplitContainer.Panel2Collapsed = true;
masterSplitContainer.Panel2.Hide();

在这种情况下,我希望 DataGridView 假定 masterSplitContainer 的完整操作区域,而不是保留其预定义的边界,因为这是我添加部件时面板拆分器所在的位置而设置的。

对于消除过程,同样的事情发生在第二个 DataGridView 放置在子 SplitContainer(即bottomSplitContainer.Panel1)中 - 它也不服从其外壳的区域。

到目前为止,我已经对此进行了一些阅读,看起来这可能是一个锚定问题,但我对 .NET 和 Windows 窗体的经验非常有限,因此这可能需要一些手持或指向出明显的错误。

另外,如果你们都需要更多实际的代码参考,我很乐意应要求发布表单类。

4

1 回答 1

0

尝试这个:

添加以下方法:

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 是您拆分面板中的一个。

于 2018-02-22T20:17:59.727 回答