2016-11-18 3 views
0

これはmy previous questionのフォローアップの質問です。ダイナミックに作成されたテキストボックスからデータをフェッチする方法は?

しかし、この質問では、私はそのようなControlを作成したので、ボタンをクリックするたびに2つのTextBoxが表示されます(無期限のカウント/クリック)。再び値を入力すると、加算が行われ、結果はその行の3番目のTextBoxに格納されます。

private void buttonNewRow_Click(object sender, EventArgs e) 
     { 
      int count = 1; 
      DateTimePicker date = new DateTimePicker(); 
      count = panel1.Controls.OfType<DateTimePicker>().ToList().Count; 
      date.Location = new Point(0, 15 * count); 
      date.Size = new Size(91, 20); 
      panel1.Controls.Add(date); 

      //Textbox 1 
      TextBox textboxTranspo = new TextBox(); 
      textboxTranspo.Location = new Point(576, 45 * count); 
      textboxTranspo.Size = new Size(81, 20); 
      panel1.Controls.Add(textboxTranspo); 

      //Textbox 2 
      TextBox textboxDaily = new TextBox(); 
      textboxDaily.Location = new Point(663, 45 * count); 
      textboxDaily.Size = new Size(81, 20); 
      panel1.Controls.Add(textboxDaily); 

      //Textbox 1 + Textbox 2 result 
      TextBox textboxTotal = new TextBox(); 
      textboxTotal.Location = new Point(772, 45 * count); 
      textboxTotal.Size = new Size(100, 20); 
      panel1.Controls.Add(textboxTotal); 
} 

どのようにすればいいですか?

+0

私が思うに、あなたはグリッドコントロールを試してみてください。 – vipin

+0

コントロールのNameプロパティを設定し、 .Controls( "name")を使用してコントロールにアクセスします。 – rheitzman

+0

このアプローチの通常の解決策は、 'UserControl'を定義することです。ユーザーコントロールにロジックを追加することができます。ユーザーコントロールをプログラマチックにパネルに追加するだけです。 –

答えて

0

私は答えとして私の上記のコメントに対処します。

まず、UserControlを定義し、好きな名前を付けてください。名前はUc1としましょう。

datetimepickerと3 textboxesUc1にドラッグします。最後にコントロールの名前をdt1とし、最後にtextbox2txtTotalの場合はtextbox1txtDailyの場合はtxtTranspoの場合はtxtTranspoとします。 txtTranspotxtDailyの値を計算する必要があるので、私は簡単にするために計算ロジックにbtnComputeという名前の1 buttonを追加します。 Uc1

class Uc1 
{ 

    public Uc1() 
    { 
     InitializeComponent(); 
     this.wireEvents(); 
    } 


    // This will handle all controls events for well organized form sakes. 
    private void wireEvents() 
    { 
     this.btnCompute.Click += OnBtnComputeEvent; 
    } 


    private void OnBtnComputeEvent(object sender, EventArgs e) 
    { 
     // i used int since i do not know exactly how to do this. 
     int transpo = Int32.Parse(this.txtTranspo.Text); 
     int daily = Int32.Parse(this.txtDaily.Text); 
     double total = ((transpo + daily)/100 * 100) // <--- this is just a random computation. 

     this.txtTotal.Text = string.Format("{0:c}", total); // this will format the total to a currency. 
    } 

} 

内側その後、

次いで、溶液を構築します。またはCtrl + Shift + Bの組み合わせをクリックします。その後、Uc1が新しいコントロールとしてtoolboxに表示されます。

あなたは自分のロジックにこれを単純に行うことができます。

private void buttonNewRow_Click(object sender, EventArgs e) 
{ 
     Uc1 c = new Uc1(); 
     c.Dock = DockStyle.Top; 
     c.BringToFront(); 

     this.panel.Controls.Add(c); 
} 

あなたはいいですね。

+0

1つのことがあります。 '' int 'には、受信したエラーである' parseInt 'の定義が含まれていません。 – Noobster

+0

@Noobster答えを更新しました –

+0

こんにちは、私はこれまでのところいくつかのエラーをデバッグすることができました。 'string.format'は' string.Format'でなければなりませんが、最後のエラーは 'btnTotal'です。それは、 'btnTotal'の定義が含まれていないと言われました – Noobster

0

あなたは、このようにイベントハンドラを追加することができます。

private void buttonNewRow_Click(object sender, EventArgs e) 
{ 
    DateTimePicker date = new DateTimePicker(); 
    int count = panel1.Controls.OfType<DateTimePicker>().ToList().Count; 
    date.Location = new Point(0, 15 * count); 
    date.Size = new Size(91, 20); 
    panel1.Controls.Add(date); 

    //Textbox 1 
    TextBox textboxTranspo = new TextBox(); 
    textboxTranspo.Location = new Point(576, 45 * count); 
    textboxTranspo.Size = new Size(81, 20); 
    panel1.Controls.Add(textboxTranspo); 

    //Textbox 2 
    TextBox textboxDaily = new TextBox(); 
    textboxDaily.Location = new Point(663, 45 * count); 
    textboxDaily.Size = new Size(81, 20); 
    panel1.Controls.Add(textboxDaily); 

    //Textbox 1 + Textbox 2 result 
    TextBox textboxTotal = new TextBox(); 
    textboxTotal.Location = new Point(772, 45 * count); 
    textboxTotal.Size = new Size(100, 20); 
    panel1.Controls.Add(textboxTotal); 

    EventHandler textChanged = (o, e) => { 
     int intTranspo, intDaily; 
     if (int.TryParse(textboxTranspo.Text, out intTranspo) 
     && int.TryParse(textboxDaily.Text, out intDaily)) 
      textboxTotal.Text = (intTranspo + intDaily).ToString(); 
    }; 
    textboxTranspo.TextChanged += textChanged; 
    textboxDaily.TextChanged += textChanged; 
} 
+0

すべてのtextboxTotalを取得し、それらをすべて別のテキストボックスに追加するにはどうすればよいですか? – Noobster

+0

良い方法は 'List 'に作成するか、 'panel1.Controls.OfType ().Where(t => t.Left == 772)のような信頼性の低い方法で追加することです。 > int.Parse(t.Text))。Sum() ' – Slai

関連する問題