强制DataGridView填充SplitContainer中的可用空间

时间:2016-06-16 08:22:10

标签: c# .net winforms datagridview splitcontainer

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

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

DataGridView/SplitContainer layout

此处,红色轮廓表示父级SplitContainer,在引用中适当地称为masterSplitContainer。蓝色轮廓表示名为bottomSplitContainer的子SplitContainer占据masterSplitContainer.Panel2位置。

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

  1. 用户需要仅限单一窗格视图/ UI布局,从而使masterSplitContainer.Panel1占据masterSplitContainer的整个区域。
  2. 用户启用双窗格布局,但删除底部容器的面板2
  3. 用户想要所有三个面板。
  4. 由于我的测试版本只有SplitContainers似乎表明,第二个SplitContainer(孩子)得到了预期的点,并且非常满意这种安排,没有任何障碍。但是,当测试启用单窗格视图的设置时,结果如下:

    DataGridView issues 1

    使用以下代码禁用masterSplitContainer.Panel2

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

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

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

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

    此外,如果您需要更多实际的代码引用,我很乐意根据请求发布表单类。

1 个答案:

答案 0 :(得分: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已成为您分割面板中的一个。