2013-10-30 4 views
1

팝업 대화 상자의 텍스트 상자 값을 가져 오는 데 문제가 있습니다. 나는 program.cs의 공용 변수를 만들라고 다른 StackOverflow의 질문의 조언을 따랐습니다 :대화 상자 창에서 값 가져 오기

public static string cashTendered { get; set; } 
다음

내가 만든 내이 같은 대화 :

Cash cashform = new Cash(); 
cashform.ShowDialog(); 

그리고 사용자가를 누를 때 버튼을 클릭하면 다음과 같이 호출됩니다.

 if (isNumeric(textBox1.Text, System.Globalization.NumberStyles.Float)) 
     { 
      Program.cashTendered = textBox1.Text; 
      this.Close(); 
     } 
     else 
     { 
      MessageBox.Show("Please enter a valid amount of cash tendered. E.g. '5.50'"); 
     } 

아직 Program.cashTendered는 null입니다. 내가 뭔가 잘못하고 있는거야? 감사!

답변

5

. CashEntered 등의 공용 속성이나 문자열 대신 decimal 유형의 비슷한 속성이 있어야합니다. 양식을 다음과 같이 호출하십시오.

using (var cashDialog = new CashDialog()) 
{ 
    // pass a reference to the Form or a control in the Form which "owns" this dialog for proper modal display. 
    if (cashDialog.ShowDialog(this) == DialogResult.OK) 
    { 
     ProcessTender(cashDialog.CashEntered); 
    } 
    else 
    { 
     // user cancelled the process, you probably don't need to do anything here 
    } 
} 

임시 대화 상자의 결과를 보관하기 위해 정적 변수를 사용하는 것은 좋지 않습니다. 다음은 더 나은 대화 상자 구현입니다.

public class CashDialog : Form 
{ 
    public decimal CashEntered { get; private set; } 

    private void ok_btn_Clicked 
    { 
     decimal value; 
     if (Decimal.TryParse(cashEntered_txt.Text, out value)) 
     { 
      // add business logic here if you want to validate that the number is nonzero, positive, rounded to the nearest penny, etc. 

      CashEntered = value; 
      DialogResult = DialogResult.OK; 
     } 
     else 
     { 
      MessageBox.Show("Please enter a valid amount of cash tendered. E.g. '5.50'"); 
     } 
    } 
} 
+0

감사합니다! 완벽한 작품 – Nathan

+0

@ Nathan 당신을 진심으로 환영합니다. 이렇게하면 현금을 입력 할 때마다 대화 상자를 재사용하거나 다른 프로젝트와 공유 할 수 있습니다. –

0

가치를 얻으려는 기본 양식에는 다음과 같은 종류의 코드가 있습니다. 또한

 public string GetText() 
     { 
       return textBox1.Text; 
     } 

     public void btnClose_Click(object sender, EventArgs e) 
     { 
       this.DialogResult = DialogResult.OK; 
       this.Close(); 
     } 

     public void btnCancel_Click(object sender, EventArgs e) 
     { 
       this.Close(); 
     } 

, 당신은 당신이하지 않는 대신 경우 FormClosing 이벤트에 btnClose_Click 이벤트에서 그 라인을 수행 할 수 있습니다

 var cashTendered; 
     using (var frm = new Cash()) 
     { 
      if (frm.ShowDialog() == DialogResult.OK) 
       cashTendered = frm.GetText() 
     } 

는 그런 다음 대화 양식에, 당신은이 같은이있을 것이다 버튼을 클릭하여 값을 '제출'하십시오. 당신은 그와 같이, btnClose 이벤트 내부에 텍스트 상자에 검증의 일종을 추가 할 수 있습니다

편집 :

객체 지향 설계를 사용한다 Cash라고 우선 양식에 대한
decimal myDecimal; 
if (decimal.TryParse(textBox1.Text, out myDecimal)) 
{ 
     this.DialogResult = DialogResult.OK; 
     this.Close(); 
} 
else 
{ 
    MessageBox.Show("Invalid entry", "Error"); 
    textBox1.SelectAll(); 
} 
관련 문제