8

http://i.stack.imgur.com/SewpO.png 次の要件を満たすフォーム レイアウトを構築しようとしています。

  • panel1 は固定の高さです - タイトルなどのヘッダーのようなラベルのみが含まれます。
  • panel2 には、dockstyle 塗りつぶしの datagridview が含まれます。ここで、ユーザーは、プロパティを表示するために選択できるオブジェクトを見つけます
  • panel3 は固定の高さです - フォームの下部に配置され、datagridview から選択されたオブジェクトのプロパティが含まれます

私の問題は、パネル1とパネル3の後に残った場所全体を埋めるためにパネル2を作成することです。したがって、panel1 と panel3 の両方が高さ 100 に固定され、フォームの高さが 500 の場合、panel2 の高さは 300 である必要があり、フォームが 600 にサイズ変更される場合は、panel2 も 400 にサイズ変更される必要があります。

いくつかのドックの組み合わせを試していましたが、 panel1 ドックを上に、 panel3 を下に、 panel2 を塗りつぶしに設定しようとしましたが、予想とは異なる結果が得られます。フォームのサイズ変更イベントを処理し、panel2 を残されるサイズにサイズ変更できることはわかっていますが、これを行うためのより柔軟でクリーンな方法があるかどうか疑問に思っています。

4

5 に答える 5

6

im_a_noob が述べたように、ドッキングスペースはフォーム上のオブジェクトの順序に関連しています。オブジェクトの z オーダーを変更して、ドッキング方法を変更できます。中央のスペースを埋める必要があるパネルを右クリックして、メニューから [前面に移動] を選択できるはずです。これにより、スペースが正しく埋められ、フォーム全体が他のパネルの背後にあるはずです。

したがって、上部パネルを上部に、下部パネルを下部に、次に中央パネルを「塗りつぶし」にドッキングします。次に、右クリックして中央のものを前面に移動します。

于 2013-06-12T19:56:59.437 に答える
5

これはドキュメント アウトラインによるものです。

に行く

View -> Other Windows -> Document Outline (or ctrl + w, u)

ドック フィル パネル (中央のもの) がそのリストの 3 つのパネルの最初のものであることを確認してください。これで問題が解決するはずです。

于 2013-06-12T19:50:03.633 に答える
2

ここでは tableLayoutPanel が適しているようです。そうすれば、行 1 (パネル 1) と行 3 (パネル 3) に絶対値を設定し、中央の行 (パネル 2) に 100% を使用して、他の行と重なることなく残りのスペースを占有することが保証されます。パネル。

次に、datagridview を tableLayoutPanel の中央の行に配置すると、Dock プロパティを fill に設定できるようになり、正しく機能するはずです。

TableLayoutPanels では、1 つの要素のみをセルに配置できますが、パネルをメイン要素として追加し、そのパネル内のすべてを構成することでこれを回避できます。

于 2013-06-12T20:22:42.563 に答える
0

panel1 アンカーを上、左、右に設定するだけです。パネル 2 アンカーを上、下、左、右にします。パネル 3 は、下、左、右を固定します。これにより、上部パネルが所定の位置に留まり、下部がウィンドウとともに下に移動し、中間がその間に拡張されます.

于 2013-06-12T19:57:28.180 に答える
0

まず、パネル 1 と 3 をドッキングします (パネル 1 を上に、パネル 3 を下に):

上

これら 2 つを設定したら、[パネル 2] を選択して [塗りつぶし] に設定します。

塗りつぶし

アップデート:

パネルがコード内で正しい順序になっていることを確認するために行った簡単なコードを次に示します。

スクリーンショット

public partial class PanelForm : Form {

  public PanelForm() {
    InitializeComponent();
    int iHead = Controls.GetChildIndex(panelHead);
    int iData = Controls.GetChildIndex(panelData);
    int iFoot = Controls.GetChildIndex(panelFoot);
    if ((iHead < iData) || (iFoot < iData)) {
      panelHead.Dock = DockStyle.None;
      panelData.Dock = DockStyle.None;
      panelFoot.Dock = DockStyle.None;
      Controls.SetChildIndex(panelData, 0);
      Controls.SetChildIndex(panelHead, 1);
      Controls.SetChildIndex(panelFoot, 2);
      panelData.Dock = DockStyle.Fill;
      panelHead.Dock = DockStyle.Top;
      panelFoot.Dock = DockStyle.Bottom;
    }
    ShowData(DateTime.Now);
  }

  private void ShowData(DateTime now) {
    var table = new DataTable();
    var c1 = table.Columns.Add("Name", typeof(string));
    var c2 = table.Columns.Add("Even", typeof(bool));
    var c3 = table.Columns.Add("Index", typeof(int));
    var c4 = table.Columns.Add("Times 2", typeof(int));
    var c5 = table.Columns.Add("Inverse", typeof(double));
    var c6 = table.Columns.Add("Timespan", typeof(TimeSpan));
    var c7 = table.Columns.Add("Binary Time", typeof(long));
    var c8 = table.Columns.Add("Display", typeof(string));
    for (int i = 0; i < 1000; i++) {
      DataRow r = table.NewRow();
      r[c1] = string.Format("Row {0}", i);
      r[c2] = (i % 2 == 0);
      r[c3] = i;
      r[c4] = 2 * i;
      r[c5] = (0 < i) ? 1 / (double)i : double.NaN;
      r[c6] = DateTime.Now - now;
      r[c7] = DateTime.Now.ToBinary();
      r[c8] = string.Format("{0:g}", DateTime.Now);
      table.Rows.Add(r);
    }
    dataGridView1.DataSource = table;
  }

}
于 2013-06-12T19:59:59.950 に答える