2017-01-24 9 views
0

私はWinformsのC#アプリケーションを使用して、100個程度のテキストメッセージと各メッセージで取ることのできるいくつかのアクションで構成されるレポートを生成します。このレポートをフォームに表示して、各メッセージとその下に一連のボタンを表示します。ボタンをサポートするフォーマットされたテキストフィールド(Java JTextFieldなど)

Javaでは、通常のテキスト要素とJButtonを含むドキュメントでJTextFieldを使用していましたが、これはうまく動作していてうまく動作しています。

誰でもC#でこれを行う方法を提案できますか?または私が使用できるコントロール?

私の最初の試みは、パネルを使用して手動でラベルとボタンコントロールを設定することでしたが、これは作成するのが非常に遅いです(作成してもうまくいきますが)。

ありがとうございます!

+0

実行時に作成するのが遅いか、Visual Studioで設定するのが面倒ですか? –

+0

解決策があなたに何を期待しているかの例(画像/画像)を作ることができれば、素晴らしいことです。私は後にいくつかのコードを提供する答えを調整することができます。 – Tatranskymedved

+0

[TextBox内のボタン?](http://stackoverflow.com/questions/15868817/button-inside-a-winforms-textbox) –

答えて

0

C#Win-Formsは、Javaとは異なる方法で動作します。 Win-Formsは、スナップ様のコントロールレイアウトを持っていません。代わりに、Top、Left、Right、BottomからPxで配置されています。

その他のjava形式のレイアウトは、少し複雑ですが、サイズや位置の自動調整の進歩をあなたに知らせるWPFを使用しています。

TextBoxes,Buttonsなどは、かなり良い時間に行うことができます。Panelや他のコンポーネントをバックグラウンドで動かす必要はありません。デフォルトでWin- FormsFormを作成します。親オブジェクトはcontrolsのすべてをホストできます(アイテムを直接追加できます)。

0

私がやろうとしていることを明確にする: 私は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 
} 
関連する問題