2016-10-06 32 views
1

私はTableLayoutPanelコントロールを持つWinFormを持っています。私のコードでは、画面に添付されているモニタの数を検出し、モニタごとに列を作成し、TableLayoutControlの個々の列内の各ディスプレイのボタンを追加するので、何台のモニタが接続されていてもボタンが表示されますフォーム全体を「中心に置いた」。 1/2モニターはうまくレンダリングされますが、3つのモニターの結果、エンド・コラムが均等に分散されません。ここでC#TableLayoutPanelで列を均等に自動サイズ調整できない

enter image description here

私のコードです:

  int count = Screen.AllScreens.Count(); 
      this.monitorLayoutPanel.ColumnCount = count; 

      ColumnStyle cs = new ColumnStyle(SizeType.Percent, 100/count); 
      this.monitorLayoutPanel.ColumnStyles.Add(cs); 

      this.monitorLayoutPanel.AutoSize = true; 

      var buttonSize = new Size(95, 75); 

      int z = 0; 
      foreach (var screen in Screen.AllScreens.OrderBy(i => i.Bounds.X)) 
      { 

       Button monitor = new Button 
       { 
        Name = "Monitor" + screen, 
        AutoSize = true, 
        Size = buttonSize, 

        BackgroundImageLayout = ImageLayout.Stretch,             
        BackgroundImage = Properties.Resources.display_enabled, 
        TextAlign = ContentAlignment.MiddleCenter, 
        Font = new Font("Segoe UI", 10, FontStyle.Bold), 
        ForeColor = Color.White, 
        BackColor = Color.Transparent, 
        Text = screen.Bounds.Width + "x" + screen.Bounds.Height, 
        Anchor = System.Windows.Forms.AnchorStyles.None 
       }; 


       this.monitorLayoutPanel.Controls.Add(monitor, z, 0); 
       z++; 
       monitor.MouseClick += new MouseEventHandler(monitor_Click); 
      } 

私はボタンが小さく作ってみました、とフォームのサイズを増加させたが、最後の列は常に最初の2よりも小さくなってきました。私はそれを理解できません!

+1

[Windowsフォームを使用して魔方陣を作成するには?](http://stackoverflow.com/q/33968993/3110834) –

+0

[フォームのセンターでFlowLayoutPanel内容を設定する方法](HTTPS: //stackoverflow.com/questions/38824530/how-to-set-flow-out-content-out-center-of-form) –

+0

ダイナミックコントロールをフォームの下部中央に揃えるには、リンクされた2番目のポストを見てください。アンカーが 'Top、Bottom'に設定され、単一列のドッキングボタンから' TableLayoutPanel'でホストされる自動サイズの 'FlowLayoutPanel'にボタンコントロールを追加することができます。 –

答えて

1

Reza Aghaeiは正しい方向に私を指摘し、このスレッドHow to create a magic square using Windows Forms?に私を指摘しました。以下のコードを更新しました。 :)

  int screens = Screen.AllScreens.Count(); 
      this.monitorLayoutPanel.ColumnStyles.Clear(); 
      this.monitorLayoutPanel.ColumnCount = screens;    
      this.monitorLayoutPanel.AutoSize = true; 

      int z = 0; 
      foreach (var screen in Screen.AllScreens.OrderBy(i => i.Bounds.X)) 
      { 
       var percent = 100f/screens; 
       this.monitorLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, percent)); 

       Button monitor = new Button 
       { 
        Name = "Monitor" + screen, 
        Size = new Size(95, 75), 
        BackgroundImageLayout = ImageLayout.Stretch,             
        BackgroundImage = Properties.Resources.display_enabled, 
        TextAlign = ContentAlignment.MiddleCenter, 
        Font = new Font("Segoe UI", 10, FontStyle.Bold), 
        ForeColor = Color.White, 
        BackColor = Color.Transparent, 
        Text = screen.Bounds.Width + "x" + screen.Bounds.Height, 
        Anchor = System.Windows.Forms.AnchorStyles.None 
       }; 


       this.monitorLayoutPanel.Controls.Add(monitor, z, 0); 
       z++; 
       monitor.MouseClick += new MouseEventHandler(monitor_Click); 
1

最初にColumnStylesをクリアしてください。

その後、
this.monitorLayoutPanel.ColumnStyles.Clear(); 

int count = Screen.AllScreens.Count(); 

for (int i = 0; i < count; i++) 
{ 
    ColumnStyle cs = new ColumnStyle(SizeType.Percent, (float)100/count); 
    this.monitorLayoutPanel.ColumnStyles.Add(cs); 
} 

this.monitorLayoutPanel.AutoSize = true; 

... 
+0

提案していただきありがとうございます。最後の2つの列がさらに均等になりましたが、3つの列はすべて均等に分散されていませんでした:[screenshot](https://imgur.com/a/LJZBb) – Rawns

+0

浮動小数点数による可能性があります。 – MSL

+0

@MSLはい、「ColumnStyles」は最初にクリアする必要があります。この問題では、ボタンリストをフォームの下部中央に置いておきます(このように)(https://stackoverflow.com/questions/38824530/how-to-set-flowlayoutpanel-contents-at-center-of-形)。 –

関連する問題