私がやろうとしていることを明確にする: 私はWinFormsアプリケーションにフォームを持っています。テキストとボタンからなるスクロール可能なパネル上に、このフォーム内に動的プロセスの出力を表示したいとします。
は私がもともと持っていた何をこのような何か(注意これは単にメモリから入力される)であった。
public void displayOutput(List<Item> items) {
//create panel to host dynamic content
Panel panel = new Panel();
form.Controls.Add(panel);
panel.AutoScroll = true;
panel.OnLayout += Do_Layout;
//create UI controls for each report item
foreach (Item item in items) {
//create a label to display the item
Label l = new Label();
l.Text = item.Messagel
panel.Controls.Add(l);
//create a button to perform the item action
Button b = new Button();
b.Text = "Do something";
b.Click += ... delegate to perform the action
panel.Controls.Add(b);
}
}
public void Do_Layout(object sender, EventArgs args) {
int y = 0;
Panel panel = (Panel)sender;
foreach (Control control in panel.Controls) {
Size sz = control.GetPreferredSize();
control.Bounds = new Rectangle(0, y, sz.Width, sz.Height);
y += sz.Height;
}
}
ちょうど働いたが、パネルのレイアウトでは信じられないほど遅かったです。
私が問題を解決するために見つけたのは、すべてのコントロールの境界を計算しているうちに、パネルのレイアウトを中断することでした。 SuspendLayout()とResumeLayout()の呼び出しを追加するだけで完全に修正されました。
public void Do_Layout(object sender, EventArgs args) {
int y = 0;
Panel panel = (Panel)sender;
panel.SuspendLayout(); ////////////<<<<< added this
foreach (Control control in panel.Controls) {
Size sz = control.GetPreferredSize();
control.Bounds = new Rectangle(0, y, sz.Width, sz.Height);
y += sz.Height;
}
panel.ResumeLayout(); ////////////<<<<< added this
}
実行時に作成するのが遅いか、Visual Studioで設定するのが面倒ですか? –
解決策があなたに何を期待しているかの例(画像/画像)を作ることができれば、素晴らしいことです。私は後にいくつかのコードを提供する答えを調整することができます。 – Tatranskymedved
[TextBox内のボタン?](http://stackoverflow.com/questions/15868817/button-inside-a-winforms-textbox) –