
図のように"追加ボタン"を押すと親パネル(panel1)に子パネル(panel2)を上から
追加する画面を作りました。(以下がソースです)
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
foreach (Panel p in panel1.Controls)
{
i++;
p.Top += 40;
}
Panel panel2 = new Panel();
createPanel(panel2, i);※子パネルのレイアウトを設定し、確認用の連番をセットしています
panel1.Controls.Add(panel2);
}
常に親パネルの最上段に子パネルを追加したいのですが、
スクロールバーで親パネルの下のほうで追加ボタンを押すと、
親パネルの表示されている最上段の位置に子パネルが追加されてしまいます。
スクロールバーで親パネルの最下部に移動していても、追加するときは親パネルの(0,0,)の位置に
子パネルを表示させるにはどのように実装したらよいでしょうか?
メソッドcreatePanel(panel2, i)の中で、
子パネルのロケーションを0,0に設定してもダメでした。
以上、よろしくお願いいたします。

A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
まず,親パネルのかわりにFlowLayoutPanellを使って下さい。
この時,
・FlowDirectionをTopDownにする
→内部のコントロールを上端から下に並べる
※BottomUpは下端から上に並べていく
・WrapContentsをFalseにする
→コントロールが入りきらない場合にコントロールを折り返して配置させない
・AutoScrollをTrueにする
→コントロールが入りきらない場合にスクロールバーを表示する
という設定が必要になります。
次に,基本的にはコントロールをControls.Addで追加していくのですが,
上記のプロパティからわかるように,単純に追加すると一番下に追加されます。
これを避けるために,Controls.AddのあとにControls.SetChildIndexでnewIndexに0を指定し,
追加したコントロールを一番上になるようにします。
最後に,幅の調整です。
Dock系による調整が出来ないので,丁度の幅にするには
FlowLayoutPanelのClientSize.Widthから追加したコントロールのMargine.Horizontalを引くことで出せますが,
これだけだとスクロールバーが表示されたタイミングで幅がずれます。
いくつか試したところ,
1. FlowLayoutPanelをSuspendLayoutする
2. FlowLayoutPanelのAutoScrollをfalseにする
3. FlowLayoutPanelの全ての子コントロールの幅を調整する
4. FlowLayoutPanelのAutoScrollをtrueにする
5. FlowLayoutPanelをResumeLayoutする
でできました。
以下,TextBoxを追加していくサンプル (C# on .NET Framework 4) です。
・FlowLayoutPanel型のコントロールflowLayoutPanel1
・Button型のコントロールbutton1
を置き,
・button1.Clickイベントにbutton1_Click
・flowLayoutPanel1.ResizeイベントにflowLayoutPanel1_Resize
を設定しています。
また,_をスペースに,もしくは____をタブに変換してください。
private void button1_Click (object sender, EventArgs e)
{
____var textBox = new TextBox() { Text = flowLayoutPanel1.Controls.Count.ToString() };
____flowLayoutPanel1.Controls.Add(textBox);
____flowLayoutPanel1.Controls.SetChildIndex(textBox, 0);
____ResetChildSize();
}
private void flowLayoutPanel1_Resize (object sender, EventArgs e)
{
____ResetChildSize();
}
private void ResetChildSize ()
{
____flowLayoutPanel1.SuspendLayout();
____flowLayoutPanel1.AutoScroll = false;
____foreach (var control in flowLayoutPanel1.Controls.Cast<Control>())
____{
________control.Width = flowLayoutPanel1.ClientSize.Width - control.Margin.Horizontal;
____}
____flowLayoutPanel1.AutoScroll = true;
____flowLayoutPanel1.ResumeLayout();
}
ところで,子パネルはユーザーコントロール化できないのですか。
Panelよりも色々と便利なことが多いですけれども……。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- YouTube youtubeは画面と操作パネルが別々に表示されていたのに画面上にかぶるように表示されるようになった 1 2022/05/08 10:04
- その他(ソフトウェア) Figma 1 2023/06/23 14:22
- DIY・エクステリア ルミナスのラックで、ストーブガードを自作したいが、熱くはならない? 1 2023/02/18 18:18
- その他(法律) イラストの著作権についてです。 フラワースタンドのパネル用のイラストを私がとある絵師様に依頼しました 1 2023/05/28 00:26
- モニター・ディスプレイ TNパネル、IPSパネル、ADSパネルの画質や色味はかなり違いますか?気にならない程度ですか? 3 2023/01/02 20:02
- 一戸建て 一戸建ての太陽光発電について教えて下さい。 今度新築を建てるのですが、初期費用0円の太陽光パネル設置 8 2022/08/21 12:49
- ノートパソコン 【IGZOパネル】IGZOディスプレイを採用したノートパソコンを教えてください。 I 1 2023/07/11 19:58
- クラフト・工作 接着芯の貼り方と作り方 1 2023/04/21 08:02
- Illustrator(イラストレーター) 至急。イラストレーターでこの画面で、整列パネルが表示されてないのですがどこを押せば表示されますか? 1 2022/07/25 19:21
- 一戸建て 家の太陽光発電をLIXIL TEPCOの『建て得』採用してる人いませんか? 現在の発電量などをリアル 1 2023/04/03 06:39
このQ&Aを見た人はこんなQ&Aも見ています
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。
-
【お題】甲子園での思い出の残し方
【お題】「球場の砂を持って帰る」はもう古いと思った高校球児が、甲子園で負けた際に、思い出に残そうと思って行ったこと
-
限定しりとり
文字数6文字以上の単語でしりとりしましょう
-
スタッフと宿泊客が全員斜め上を行くホテルのレビュー
スタッフも宿泊客も、一流を通り越して全員斜め上なホテルのレビューにありがちな内容を教えて下さい
-
カラオケの鉄板ソング
歌えばその場が絶対盛り上がる「鉄板ソング」を教えてください!
-
C#でButtonのフォーカス枠を消したいのですが
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
ダイアログボックスのボタンコ...
-
ActiveXコントロールを.NETにイ...
-
文字色を変えたい(ACCESS VBA)
-
TabControlとToolBarの背景色変更
-
コモンダイアログコントロール...
-
CEdit の内容が変わった時にメ...
-
スピンボタンを右クリックして...
-
.NETでチャートにスクロールバ...
-
Excel VBAでのMultipageの選択
-
ウィンドウやボタンコントロー...
-
regsvr32でActiveX登録を行ったocx
-
スクロールバーのつけ方
-
resource.h
-
VBAでリストボックス内で↑↓の操...
-
エクセル - リストボックスのマ...
-
VisualBasic 2010でVB6で使って...
-
タブコントロール上のリストコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
DateTimePickerでに年月までし...
-
ActiveXコントロールを.NETにイ...
-
スピンボタンを右クリックして...
-
フォームでPDFを表示させた...
-
コモンダイアログコントロール...
-
ワードのドロップダウンリスト
-
エクセル - リストボックスのマ...
-
CEdit の内容が変わった時にメ...
-
警告表示を非表示にしたい
-
VBAでリストボックス内で↑↓の操...
-
連続で印刷すると画像が更新さ...
-
EXCELVBA リストボックスで選択...
-
TabControlが変る瞬間イベント
-
TabControlとToolBarの背景色変更
-
VisualStudio MFC変数が追加で...
-
VB.Net Tabコントロール中のす...
-
C#.NETでのCOMコンポーネント作...
-
Windows APIのGetOpenFileName...
おすすめ情報