2016-08-27 8 views
-1

いくつかのテキストボックスを持つユーザーコントロールがあります。また、OnTextChangedイベントで条件が満たされていない場合は、テキストボックスtxtOneの以前の値を保持できますtxtA、txtB、txtCのテキストボックス。usercontrolのonchangeイベントのテキストボックスの以前の値を保持する方法

変数 "one"は、テキストボックスの以前の値と見なされます。私はusercontrolの下のコードを追加しました。

protected void txtOne_TextChanged(object sender, EventArgs e) 
{ 
    total = Convert.ToInt32(txtA.Text) + Convert.ToInt32(txtB.Text) + Convert.ToInt32(txtC.Text); 
    if (total > Convert.ToInt32(txtOne.Text.ToString())) 
    { 
     txtOne.Text = one.ToString(); 
    } 
} 

ここで、「1」変数の値は0になります。前の値が格納されます。 "one"変数に値を格納する場所を教えてください。

+0

*決して* Convert.ToInt32()、常にInt32.TryParse()を使用しないでください。ユーザーが常に正しいキーを押すことは期待できません。 txtOne.TextChangedイベントのイベントハンドラでtxtOneを更新することは、他の点では意味がなく、このWebサイトの名前が付けられたクラッシュを引き起こす可能性があります。 –

+0

私に例を教えてください。 –

+0

意味のないスニペットから役に立つ例を書くのは非常に難しいです。盲目的に推測する:TextBoxの代わりにtxtOneをラベルにすることで先に進めてください。他の3つのボックスのTextChangedイベントハンドラを使用すると、合計を計算しラベルを更新するメソッドを呼び出す必要があります。 –

答えて

1

以下のコードは、どのような方法でも最適化または一般化されていません。可能であれば、元のコードに基づいて回答を表示するように設計されたサンプルコードの近くにあります。&私は、テキストボックスではなくコンボボックスを使うことや、バリデーションを使ってエントリがすべて数字であることを確認することをお勧めします。以下のコードはこれまでのコードとは異なり、提供したコードに基づいて質問にのみ回答します。

TextBox txtA = new TextBox(); 
    TextBox txtB = new TextBox(); 
    TextBox txtC = new TextBox(); 
    int total = 0; 
    TextBox txtOne = new TextBox(); 
    string newOne = ""; 
    string someDefaultValue = ""; 
    string lastOne = ""; 
    if(txtA.Text.Length==0||txtB.Text.Length==0||txtC.Text.Length==0){ 
     //user has not entered required fields -- abort 
     return; 
    } 
    bool isTextChanging = true;//CHANGE TO FALSE AT END OF PAGE_ONLOAD 
    protected void txtOne_TextChanged(object sender, EventArgs e) 
    { 
     if(!isTextChanging){ 
     isTextChanging=true; 
     total = getTotal(new string[] { txtA.Text, txtB.Text, txtC.Text }); 
     if (total > -1) 
     { 
      int totalTest = 0; 
      if (int.TryParse(txtOne.Text, out totalTest)) 
      { 
       if (total > totalTest) 
       { 
        txtOne.Text = lastOne.Length > 0 ? lastOne : someDefaultValue;//default value for the first run when there is no last value 
        lastOne = newOne;//whatever the value of "one" is this time 
       } 
      } 
      else 
      { 
       MessageBox.Show("YOu must only enter numbers"); 
      } 
     } 
     } 
     isTextChanging=false; 
    } 
    private int getTotal(string[] inputs) 
    { 
     int total = 0; 
     int subTotal = 0; 
     foreach(string input in inputs) 
     { 
      if(int.TryParse(input,out subTotal)){ 
       total += subTotal; 
      }else{ 
       MessageBox.Show("You must only enter numbers"); 
       return -1; 
      } 
     } 
     return total; 
    } 
+0

UserControlを使用していて、UserControlでTextChangedを追加しているため、期待どおりに動作しません。最初に私はlastOne変数の値をPage_LoadイベントのtxtOne.Textで初期化しようとしています。私は5つのusercontrolを持っているので5回発射しています。あなたは私に最後の値で初期化しなければならない場所を教えてください。 –

+0

あなたはこれについて、最適化された答えや一般化された答えではなく、あなたが求めていることを行う方法の例を欠場しました。私はあなたの問題が何であるかは完全には分かっていませんが、私があなたに変えられた出来事をいくつかのコントロールにリンクさせる例があるからです。それらのすべてを一度に実行しないようにするには、上記の私の改訂コード例のようなブール値を追加します。 onChangedイベントをトリガーせずにテキストボックスを変更する場合はいつでも、isTextChanging = trueを設定してください。 –

+0

実際には、2つのテキストボックスが空白のままになっている場合は、処理を強制終了します。すべてのテキストボックスが一杯になっている場合は、処理のみが行われます。私はテキストボックスはこれを行う良い方法ではないとあなたに言った - と私はあなたが求めた特定の質問に答えた。あなたはまだ解決策を確定するためにあなたの脳を使用するか、それについて別の質問をする必要があります。 –

0

[OK] - 私は混乱しています。それは言語のことかもしれません。これはあなたが達成しようとしているものですが、ドロップダウンリストの代わりにテキストボックスを使用していますか?

フロントエンド:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="SO_Web.WebForm1" %> 

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title></title> 
</head> 
<body> 
<form id="form1" runat="server"> 
<div id="div_Boxes" runat="server"> 

</div> 
</form> 
</body> 
</html> 

バックエンド:

protected void Page_Load(object sender, EventArgs e) 
    { 
     createBoxes(); 
    } 
    string[] boxNames = { "One", "Two", "Three" }; 
    private void createBoxes() 
    { 

     int x = 0; 
     int y = 10; 
     Panel p = new Panel(); 
     foreach (string name in boxNames) 
     { 

      Label l = new Label(); 
      l.ID = "lbl_" + name; 
      l.Text = "Select Value " + name; 
      l.Style.Add("float", "left"); 
      DropDownList c = new DropDownList(); 
      c.ID = "cbx_" + name; 
      c.Items.Add("Select One"); 
      for (int i = 1; i < 101; i++) 
      { 
       c.Items.Add(i.ToString()); 
      } 
      c.SelectedIndex = 0; 
      c.AutoPostBack = true; 
      c.Style.Add("display", "block"); 
      c.SelectedIndexChanged += cbx_Changed; 
      p.Controls.Add(l); 
      p.Controls.Add(c); 
     } 

     Label lbl_Total = new Label(); 
     lbl_Total.Text = "Your Total:"; 
     TextBox txt_Total = new TextBox(); 
     txt_Total.ID = "txt_Total"; 
     txt_Total.Width = 75; 
     p.Controls.Add(lbl_Total); 
     p.Controls.Add(txt_Total); 
     p.Width = 300; 
     p.Height = 200; 
     div_Boxes.Controls.Add(p); 
    } 
    protected void cbx_Changed(object sender, EventArgs e) 
    { 
     bool proceed = true; 
     int total = 0; 
     foreach (string name in boxNames) 
     { 
      DropDownList c = (DropDownList)findControl(this.Page.Controls,"cbx_" + name); 
      if (c.SelectedIndex == 0) 
      { 
       proceed = false; 
      } 
      else 
      { 
       total += c.SelectedIndex; 

      } 
     } 
     if (proceed) 
     { 
      ((TextBox)findControl(this.Page.Controls,"txt_Total")).Text = total.ToString("C2"); 
     } 

    } 
    private Control findControl(ControlCollection page, string id) 
    { 
     foreach (Control c in page) 
     { 
      if (c.ID == id) 
      { 
       return c; 
      } 

      if (c.HasControls()) 
      { 
       var res = findControl(c.Controls, id); 

       if (res != null) 
       { 
        return res; 
       } 
      } 
     } 
     return null; 
    } 

しかし、利用者ならば、あなたはtexboxesを使用して、ユーザーが項目を入力できるようにしたい、とあなたは110のMAX値が欲しいですすべての3つのボックスで110未満の値を入力すると、合計が必要になります。ユーザーが任意のボックスに対して> 110を入力した場合、値を100にリセットしますか?あれは正しいですか?

関連する問題