C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

No87308 の続きになるのですが

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■87405 / inTopicNo.1)  No87308 の続きになるのですが
  
□投稿者/ 夜叉丸 (108回)-(2018/05/18(Fri) 11:19:08)

分類:[.NET 全般] 

今まで Panel1(LEFT) と Panel2(Fill) があり,その間に Split1 がある場合に

表示モードにより Panel1 を表示しない場合
Panel1.Visible = Split1.Visible = false;

表示する場合
Panel1.Visible = Split1.Visible = false;
Panel1.BringToFront();
Split1.BringToFront();
Panel2.BringToFront();

にて処理していたのですが、

PanelContainer を使用した場合には
どのように処理すればよいのでしょうか?
引用返信 編集キー/
■87407 / inTopicNo.2)  Re[1]: No87308 の続きになるのですが
□投稿者/ 猫まっしぐら (5回)-(2018/05/18(Fri) 11:47:28)
No87405 (夜叉丸 さん) に返信

> PanelContainer を使用した場合には
> どのように処理すればよいのでしょうか?

SplitContainerじゃなくて?
SplitContainerならPanel1Collapsed=True/False,Panel2Collapsed=True/False
で制御しますが…
引用返信 編集キー/
■87408 / inTopicNo.3)  Re[1]: No87308 の続きになるのですが
□投稿者/ 魔界の仮面弁士 (1675回)-(2018/05/18(Fri) 11:58:10)
No87405 (夜叉丸 さん) に返信
> 今まで Panel1(LEFT) と Panel2(Fill) があり,その間に Split1 がある場合に

こういう状態だったということでしょうか。

Panel panel1, panel2;
Splitter split1;
public Form1()
{
  InitializeComponent();
  Controls.Clear();
  split1 = new Splitter() { Dock = DockStyle.Left, BackColor = Color.HotPink };
  panel1 = new Panel() { Dock = DockStyle.Left, BackColor = Color.LightCyan };
  panel2 = new Panel() { Dock = DockStyle.Fill, BackColor = Color.LightGreen };
  Controls.AddRange(new Control[] { panel2, split1, panel1 });
  panel1.DoubleClick += (sender, e) => panel1.Visible = split1.Visible = false;
}



> PanelContainer を使用した場合には
> どのように処理すればよいのでしょうか?

PanelContainer というのは
SplitContainer のことでしょうか。

SplitContainer splitContainer1;
public Form1()
{
  InitializeComponent();
  Controls.Clear();
  splitContainer1 = new SplitContainer() { Dock = DockStyle.Fill, BackColor = Color.HotPink };
  splitContainer1.Panel1.BackColor = Color.LightCyan;
  splitContainer1.Panel2.BackColor = Color.LightGreen;
  Controls.Add(splitContainer1);
  splitContainer1.Panel1.DoubleClick += (sender, e) => splitContainer1.Panel1Collapsed = true;
}
引用返信 編集キー/
■87414 / inTopicNo.4)  Re[2]: No87308 の続きになるのですが
□投稿者/ 夜叉丸 (109回)-(2018/05/18(Fri) 16:12:37)
No87407 (猫まっしぐら さん) に返信
No87408 (魔界の仮面弁士 さん) に返信

すみませんでした。
PanelContainer ではなくて SplitContainer でした。

Panel1Collapsed → 説明には「Panel1を縮小するかを決定します。」
になていますが、考え方は Visible と同じでいいんですか?



引用返信 編集キー/
■87415 / inTopicNo.5)  Re[3]: No87308 の続きになるのですが
□投稿者/ 猫まっしぐら (6回)-(2018/05/18(Fri) 16:48:30)
No87414 (夜叉丸 さん) に返信

> Panel1Collapsed → 説明には「Panel1を縮小するかを決定します。」
> になていますが、考え方は Visible と同じでいいんですか?

そうです
縮小、というよりは折りたたむというイメージですかね
引用返信 編集キー/
■87553 / inTopicNo.6)  Re[2]: No87308 の続きになるのですが
□投稿者/ 夜叉丸 (116回)-(2018/06/05(Tue) 14:21:34)
ありがとうございました。

フォームのリサイズ時に
Panel1とPanel2が同時に高さが変わるのですが
Panel2を現状の高さでPanel1の高さのみ変わるようにしたいのですが
どのようにすればよいのでしょうか?

┌─────┐  以前であれば、
│┌───┐│  Panel1.Dock = Fill
││Panel1││  Panel2.Dock = Bottom
│└───┘│  にしておけばPanel2の高さは
│┌───┐│  変更されませんでした。
││Panel2││
│└───┘│
└─────┘

引用返信 編集キー/
■87554 / inTopicNo.7)  Re[3]: No87308 の続きになるのですが
□投稿者/ 猫まっしぐら (7回)-(2018/06/05(Tue) 15:10:22)
No87553 (夜叉丸 さん) に返信

SplitContainer.FixedPanelをPanel1にすればPanel1の高さ又は幅が、 Panel2にすればPanel2の高さ又は幅が固定されます
(高さ又は幅のいずれになるかはSplitContainer.Orientationによります)

その場合は.SplitContainer.IsSplitterFixed = Trueにすればユーザーによるスプリッターの移動を禁止出来ます

またスプリッターを固定した時はSplitContainer.SplitterWidthを小さくする等して動かせないことを明示した方が良いかなと

引用返信 編集キー/
■87556 / inTopicNo.8)  Re[4]: No87308 の続きになるのですが
□投稿者/ 夜叉丸 (117回)-(2018/06/05(Tue) 15:35:06)
2018/06/05(Tue) 15:48:13 編集(投稿者)
No87554 (猫まっしぐら さん) に返信
SplitContainer.FixedPanelをPanel2にすれば
固定できました。

1.		2.		3.		
┌─────┐ ┌─────┐ ┌─────┐ 
│┌───┐│ │┌───┐│ │┌───┐│ 
││Panel1││ ││   ││ ││   ││ 
│└───┘│ ││Panel1││ ││Panel1││ 
│┌───┐│ ││   ││ ││   ││ 
││Panel2││ │└───┘│ │└───┘│ 
│└───┘│ │┌───┐│ │┌───┐│ 
└─────┘ ││Panel2││ ││   ││ 
		│└───┘│ ││Panel2││ 
        └─────┘ ││   ││ 
				│└───┘│	
				└─────┘	
4.		5.		6.		
┌─────┐ ┌─────┐ ┌─────┐
│┌───┐│ │┌───┐│ │┌───┐│
││Panel1││ ││Panel1││ ││   ││
│└───┘│ │└───┘│ ││Panel1││
│┌───┐│ │┌───┐│ ││   ││
││Panel2││ ││   ││ │└───┘│
│└───┘│ ││Panel2││ │┌───┐│
└─────┘ ││   ││ ││   ││
        │└───┘│ ││Panel2││
        └─────┘ ││   ││
				│└───┘│
				└─────┘

1.最小の状態です。
2.フォームを縦に伸ばします。Panel2が固定なのでPanel1が伸びます。
3.Panel2 を縦に伸ばします。
4.フォームの縦を最小までちじめます。
5.同様にフォームの縦を伸ばすと、Panel2が固定なのにPanel2が伸びます。
6.3で伸ばした長さになるまでPanel2が伸びてからPanel1が伸びます。


5の動きが2と同様の動きにならないのでしょうか?

引用返信 編集キー/
■87558 / inTopicNo.9)  Re[5]: No87308 の続きになるのですが
□投稿者/ 猫まっしぐら (8回)-(2018/06/05(Tue) 16:35:02)
No87556 (夜叉丸 さん) に返信

すみません
こちらでは再現出来ませんでした
ちなみにPanel1MinSizeとPanel2MinSize、フォームのMinimumSizeはいくつでしょう…
引用返信 編集キー/
■87561 / inTopicNo.10)  Re[6]: No87308 の続きになるのですが
□投稿者/ 夜叉丸 (118回)-(2018/06/06(Wed) 10:32:21)
2018/06/06(Wed) 10:43:25 編集(投稿者)
No87558 (猫まっしぐら さん) に返信

> ちなみにPanel1MinSizeとPanel2MinSize、フォームのMinimumSizeはいくつでしょう…
Panel1MiniSize=140
Panel2MiniSize=100
Form.MinimumSize=(736, 389)

現状は以下のように
┌───────┐
│┌─────┐│≡Panel0≡
││ Panel0 ││Dock=Top
│└─────┘│Size=(710, 65)
│┌─────┐│
││┌───┐││≡SplitContainer≡
│││Panel1│││DOCK=Fill
││└───┘││Size=(710, 275)
││┌───┐││SplitterWidth=5
│││Panel2│││
││└───┘││
│└─────┘│
└───────┘

Panel0にはラベルやボタン等があります。
切替えにより、Panel1, Panel2 の表示順を
入れ替えたい時があるのですが、
Orienntalでは縦横の切替えはできるのですが
入替えができません。
また、sc.Panel1.Controls も使えないみたいで張替えることもできません。
コンテナを使わない場合は、DockとBringToFrontの設定を駆使するとできたのですが

引用返信 編集キー/
■87563 / inTopicNo.11)  Re[6]: No87308 の続きになるのですが
□投稿者/ 夜叉丸 (119回)-(2018/06/06(Wed) 10:43:50)
2018/06/06(Wed) 10:44:41 編集(投稿者)
No87558 (猫まっしぐら さん) に返信

> ちなみにPanel1MinSizeとPanel2MinSize、フォームのMinimumSizeはいくつでしょう…
Panel1MiniSize=140
Panel2MiniSize=100
Form.MinimumSize=(736, 389)

現状は以下のように
┌───────┐
│┌─────┐│≡Panel0≡
││ Panel0 ││Dock=Top
│└─────┘│Size=(710, 65)
│┌─────┐│
││┌───┐││≡SplitContainer≡
│││Panel1│││DOCK=Fill
││└───┘││Size=(710, 275)
││┌───┐││SplitterWidth=5
│││Panel2│││
││└───┘││
│└─────┘│
└───────┘

Panel0にはラベルやボタン等があります。
切替えにより、Panel1, Panel2 の表示順を
入れ替えたい時があるのですが、
Orienntalでは縦横の切替えはできるのですが
入替えができません。
また、sc.Panel1.Controls も使えないみたいで張替えることもできません。
コンテナを使わない場合は、DockとBringToFrontの設定を駆使するとできたのですが

引用返信 編集キー/
■87564 / inTopicNo.12)  Re[7]: No87308 の続きになるのですが
□投稿者/ 夜叉丸 (120回)-(2018/06/06(Wed) 10:44:25)
No87558 (猫まっしぐら さん) に返信

新規プロジェクトを作成して
Form1.cs は変更せずに
SplitContainerのみ張り付けて設定を変更した場合のForm1.Designer.csが以下になります。
この場合でも同じ現象が発生します。

namespace WindowsFormsApp1
{
	partial class Form1
	{
		/// <summary>
		/// 必要なデザイナー変数です。
		/// </summary>
		private System.ComponentModel.IContainer components = null;

		/// <summary>
		/// 使用中のリソースをすべてクリーンアップします。
		/// </summary>
		/// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
		protected override void Dispose(bool disposing)
		{
			if (disposing && (components != null))
			{
				components.Dispose();
			}
			base.Dispose(disposing);
		}

		#region Windows フォーム デザイナーで生成されたコード

		/// <summary>
		/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
		/// コード エディターで変更しないでください。
		/// </summary>
		private void InitializeComponent()
		{
			this.splitContainer1 = new System.Windows.Forms.SplitContainer();
			((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
			this.splitContainer1.SuspendLayout();
			this.SuspendLayout();
			// 
			// splitContainer1
			// 
			this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
			this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
			this.splitContainer1.Location = new System.Drawing.Point(0, 0);
			this.splitContainer1.Name = "splitContainer1";
			this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
			// 
			// splitContainer1.Panel1
			// 
			this.splitContainer1.Panel1.BackColor = System.Drawing.Color.Red;
			this.splitContainer1.Panel1MinSize = 170;
			// 
			// splitContainer1.Panel2
			// 
			this.splitContainer1.Panel2.BackColor = System.Drawing.Color.Blue;
			this.splitContainer1.Panel2MinSize = 150;
			this.splitContainer1.Size = new System.Drawing.Size(500, 324);
			this.splitContainer1.SplitterDistance = 170;
			this.splitContainer1.TabIndex = 0;
			// 
			// Form1
			// 
			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
			this.ClientSize = new System.Drawing.Size(500, 324);
			this.Controls.Add(this.splitContainer1);
			this.Font = new System.Drawing.Font("MS UI Gothic", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
			this.MinimumSize = new System.Drawing.Size(516, 363);
			this.Name = "Form1";
			this.Text = "Form1";
			((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
			this.splitContainer1.ResumeLayout(false);
			this.ResumeLayout(false);

		}

		#endregion

		private System.Windows.Forms.SplitContainer splitContainer1;
	}
}


引用返信 編集キー/
■87566 / inTopicNo.13)  Re[7]: No87308 の続きになるのですが
□投稿者/ 猫まっしぐら (9回)-(2018/06/06(Wed) 14:34:23)
No87563 (夜叉丸 さん) に返信

取り敢えず中身の入れ替えですが、SplitContainerのPanel1,Panel2にパネルコントロールをDock=Fillで貼っておいてボタンのクリックイベント等で
    If Flg Then
        Flg = False
        SC.Panel1.Controls.Remove(P1)
        SC.Panel2.Controls.Remove(P2)
        SC.Panel1.Controls.Add(P1)
        SC.Panel2.Controls.Add(P2)
    Else
        Flg = True
        SC.Panel1.Controls.Remove(P1)
        SC.Panel2.Controls.Remove(P2)
        SC.Panel1.Controls.Add(P2)
        SC.Panel2.Controls.Add(P1)
    End If
とやれば出来ることは出来ます

引用返信 編集キー/
■87567 / inTopicNo.14)  Re[8]: No87308 の続きになるのですが
□投稿者/ 猫まっしぐら (10回)-(2018/06/06(Wed) 15:09:33)
No87564 (夜叉丸 さん) に返信

再現しました
これ3でPanel1MinSizeまで押し込むのがミソですね
つまりPanel1MinSizeに当たったところでリサイズが完了してしまってPanel2の高さが内部的に更新されなくなってしまうのでその高さを
保持してしまうんではないかと…

対処方法はSizeChangedイベントで
SC.SplitterDistance = SC.Height - SC.Panel2.Height
でどうでしょう
(これが正しいのかは自信ありませんが)

引用返信 編集キー/
■87568 / inTopicNo.15)  Re[9]: No87308 の続きになるのですが
□投稿者/ 夜叉丸 (122回)-(2018/06/06(Wed) 18:54:39)
No87567 (猫まっしぐら さん) に返信

変更しました。
5の動きは治りました。

3→4の動きで

panel2 固定なのに、
panel1, panel2 が同時に小さくなっていきます。

panel1 が縮小していき最小に達してから
panel2 が縮小してき4になってほしいです。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ