tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルSplitContainerでパネルの入替
記事No7110
投稿日: 2008/03/03(Mon) 10:02
投稿者ダンボ
お世話になっております。
VB2005のSplitContainerで2つのパネルの内容を一瞬に入れ替える方法が
ないかと模索しています。今作っているツールでは2つのパネル内容は
まったく同じ構成で、TextBox,DataGridView,StatusBarを各1個備えています。

Panel1には主情報をPanel2にはサブ情報(もう少し具体的に言えば
Panel1には転送元フォルダ情報をPanel2には転送先フォルダ情報)が
入っています。まずPanel1で転送元フォルダをゴチョゴチョした後に
転送指示を行うとPanel2の転送先フォルダが主役になります。

このときPanel1とPanel2を入れ替えて、常に主役がPanel1(左側あるいは上側)に
来るようにしたいと思います。SplitContainerのOrientationにInvertみたいな
ものがあれば済むことなんですが。

GroupBoxを新設してTextBox,DataGridView,StatusBarを内包して、
転送指示の際にGroupBoxのコンテナを替えるような方法でしょうかね?

[ツリー表示へ]
タイトルRe: SplitContainerでパネルの入替
記事No7111
投稿日: 2008/03/03(Mon) 16:40
投稿者y4yama
> お世話になっております。
> VB2005のSplitContainerで2つのパネルの内容を一瞬に入れ替える方法が
> ないかと模索しています。今作っているツールでは2つのパネル内容は
> まったく同じ構成で、TextBox,DataGridView,StatusBarを各1個備えています。
>
> このときPanel1とPanel2を入れ替えて、

> GroupBoxを新設してTextBox,DataGridView,StatusBarを内包して、
> 転送指示の際にGroupBoxのコンテナを替えるような方法でしょうかね?

こんにちは
はじめにPanel1にButton1,TextBox1があるときに

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.SplitContainer1.Panel2.Controls.Add(Me.Button1)
        Me.SplitContainer1.Panel2.Controls.Add(Me.TextBox1)
        Me.SplitContainer1.Panel1.Controls.Add(Me.Button2)
と並べるだけで、Removeはしなくても、Controlsの中の入れ替えは出来ましたが・・・
外しましたかねぇ・・

[ツリー表示へ]
タイトルRe: SplitContainerでパネルの入替
記事No7112
投稿日: 2008/03/03(Mon) 16:55
投稿者y4yama
        Me.SplitContainer1.RightToLeft = Windows.Forms.RightToLeft.Yes

としたら、簡単に左右が反転しましたデス・・・が、TextBoxの中の文字が右詰めになりました・・・

[ツリー表示へ]
タイトルRe^2: SplitContainerでパネルの入替
記事No7113
投稿日: 2008/03/03(Mon) 17:05
投稿者魔界の仮面弁士
>> GroupBoxを新設してTextBox,DataGridView,StatusBarを内包して、
>> 転送指示の際にGroupBoxのコンテナを替えるような方法でしょうかね?
それで良いと思いますよ。
見た目を維持したいのであれば、GroupBox ではなく、Panel を使ってみてください。


> Me.SplitContainer1.RightToLeft = Windows.Forms.RightToLeft.Yes
> としたら、簡単に左右が反転しましたデス・・・が、TextBoxの中の文字が右詰めになりました・・・
RightToLeft は、アラビア語などの「右から左に記述する言語」のためのものです。
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=6466&reno=6465&oya=6463&mode=msgview&page=0

[ツリー表示へ]
タイトル[解決]SplitContainerでパネルの入替
記事No7121
投稿日: 2008/03/04(Tue) 06:49
投稿者ダンボ
y4yamaさん、魔界の仮面弁士さん、どうもありがとうございます。
お二人の回答で自信を得て実装したら5分もかからずに実現できてしまいました。

> 見た目を維持したいのであれば、GroupBox ではなく、Panel を使ってみてください。
Me.SplitContainerFC.Panel1.Controls.Add(PanelOut)
Me.SplitContainerFC.Panel2.Controls.Add(PanelIn)
の2行を追加するだけでした。コードは。

> と並べるだけで、Removeはしなくても、Controlsの中の入れ替えは出来ましたが・・・
Me.SplitContainerFC.Panel1.Controls.Remove(PanelIn)
Me.SplitContainerFC.Panel2.Controls.Remove(PanelOut)
Me.SplitContainerFC.Panel1.Controls.Add(PanelOut)
Me.SplitContainerFC.Panel2.Controls.Add(PanelIn)
本来はこう書くべきだと思うんですが。。。
ステップモードで確認するとy4yamaさんのおっしゃるとおり、
Me.SplitContainerFC.Panel1.Controls.Add(PanelOut)実行と同時に
Me.SplitContainerFC.Panel2.ControlsからPanelOutが除かれていました。

ちょっと疑問の残る言語仕様です。そりゃコントロールが同時に複数の
コントロール下にあるという事態は都合が悪いので、Add時に同時に暗黙に
Removeしちゃうということなんでしょう。コーダーに断りも無く。

以下感想です。
1.SplitContainer便利です。今回の要望のようにInvertメソッドを
  付け加えてくれるといいなぁ。
2.SplitContainer現状は2ペイン固定ですが、少なくとも3ペインは
  サポートして欲しいなぁ。よくあるパターンですもの。
3.Dock=Fill,Top,Bottom,Left,Right便利です。コードを書かずに
  デザイン時に指定するだけでよいので。
  できればDock=Horizontal,Verticalも実装して欲しい。というのも
  今回はパネル内に上からTextBox,DataGridView,StatusBarを隙間無く
  配置したかったんです。TextBoxのDock=Top、StatusBarのDock=Bottom
  まではgoodなんですが、真ん中のDataGridViewについては結局コード
  を書くか、あるいはもうひとつSplitContainerを噛ませるしか無く。
4.造語を思いつきました。「コントロールスパゲッティ」
  コードを楽にしたぶん、今度はコントロール管理が大変です。今回一番
  深いのは、Form→SplitContainerMain→SplitContainerMain.Panel1
  →SplitContainerFC→SplitContainerFC.Panel1→PanelIn
  →StatusBarIn→ToolStripButton→DropDownItems

[ツリー表示へ]
タイトルRe: [解決]SplitContainerでパネルの入替
記事No7122
投稿日: 2008/03/04(Tue) 07:24
投稿者Hongliang
> ステップモードで確認するとy4yamaさんのおっしゃるとおり、
> Me.SplitContainerFC.Panel1.Controls.Add(PanelOut)実行と同時に
> Me.SplitContainerFC.Panel2.ControlsからPanelOutが除かれていました。
>
> ちょっと疑問の残る言語仕様です。そりゃコントロールが同時に複数の
> コントロール下にあるという事態は都合が悪いので、Add時に同時に暗黙に
> Removeしちゃうということなんでしょう。コーダーに断りも無く。

Control.ControlCollection.Add の解説でちゃんと断っています。

[ツリー表示へ]
タイトルRe: [解決]SplitContainerでパネルの入替
記事No7124
投稿日: 2008/03/04(Tue) 09:13
投稿者魔界の仮面弁士
> 1.SplitContainer便利です。今回の要望のようにInvertメソッドを
>   付け加えてくれるといいなぁ。
ここで言っても「要望」にはなりません。
是非、Microsoft にフィードバックしてみてください。
http://connect.microsoft.com/

> 2.SplitContainer現状は2ペイン固定ですが、少なくとも3ペインは
>   サポートして欲しいなぁ。よくあるパターンですもの。
SplitContainer 内に SplitContainer を入れ子にして使ってみては如何でしょう。

>   今回はパネル内に上からTextBox,DataGridView,StatusBarを隙間無く
>   配置したかったんです。
配置だけの問題なら、TableLayoutPanel を試してみてください。

StatusBar の高さは固定で、他2つの高さは可変…という配置などを望むなら、
Dock ではなく、Anchor で対処できるかと思います。

> 4.造語を思いつきました。「コントロールスパゲッティ」
>   コードを楽にしたぶん、今度はコントロール管理が大変です。
コントロールは、[ドキュメント アウトライン]ウィンドウで一覧できます。
また、同じようなコントロールの組み合わせにが繰り返し使われる場合には、
UserControl に纏めた方が良いかも知れません。

[ツリー表示へ]
タイトルRe: [解決]SplitContainerでパネルの入替
記事No7125
投稿日: 2008/03/04(Tue) 09:40
投稿者よねKEN
> ちょっと疑問の残る言語仕様です。そりゃコントロールが同時に複数の
> コントロール下にあるという事態は都合が悪いので、Add時に同時に暗黙に
> Removeしちゃうということなんでしょう。コーダーに断りも無く。

ささいな話なんで、さらっとスルーしてもらってもいいのですが、
言語仕様ではなく、ライブラリの仕様ですね。
その挙動に言語は噛んでいませんので。

[ツリー表示へ]
タイトルRe^2: [解決]SplitContainerでパネルの入替
記事No7129
投稿日: 2008/03/04(Tue) 11:40
投稿者ダンボ
皆さん、レスありがとうございます。
了解しましたので、一言ずつお礼を兼ねて。

> Hongliang さん、確認しました。
Control は、一度に 1 つの Control..::.ControlCollection にだけ割り当てることができます。Control が既に他のコントロールの子コントロールである場合は、別のコントロールに追加される前にそのコントロールから削除されます。

> 魔界の仮面弁士さん
TableLayoutPanelも検討してみます。

> よねKEN さん
まっこと。

[ツリー表示へ]