Перемещение данных из одного текстового поля формы в другое на c#

#c# #winforms

#c# #winforms

Вопрос:

Итак, у меня есть итоговая форма счета, которая, помимо прочего, должна вычислять процентную скидку. Я добавляю вторую форму в код, который позволяет изменять налог с продаж, я получил ее для заполнения формы и фактически работы без ошибок, но я не могу заставить ее перемещать данные из текстового поля в frmSalesTax в txtSalesTax.Text во frmInvoiceTotal.

frmInvoiceTotal Код:

  public frmInvoiceTotal()
    {
        InitializeComponent();
    }
    frmSalesTax percent = new frmSalesTax();
    private void btnCalculate_Click(object sender, EventArgs e)
    {
        decimal productTotal = Convert.ToDecimal(txtProductTotal.Text);
        decimal salesTax = (7.75m/100m) *  productTotal;
        decimal discountPercent = .0m;

        if (productTotal < 100)
            discountPercent = .0m;
        else if (productTotal >= 100 amp;amp; productTotal < 250)
            discountPercent = .1m;
        else if (productTotal >= 250)
            discountPercent = .25m;

        decimal discountAmount = (productTotal   salesTax) * discountPercent;
        decimal subtotal = productTotal - discountAmount;
        decimal invoiceTotal = (subtotal   salesTax) - discountAmount;


        txtSubtotal.Text = subtotal.ToString("c");
        txtSalesTax.Text = salesTax.ToString("c");
        txtDiscountPercent.Text = discountPercent.ToString("p1");
        txtDiscountAmount.Text = discountAmount.ToString("c");
        txtTotal.Text = invoiceTotal.ToString("c");

        txtProductTotal.Focus();
    }

private void btnChange_Click(object sender, EventArgs e)
    {
        percent.salesTax = txtSalesTax.Text;
        switch (percent.ShowDialog())
        {
            case DialogResult.OK:
                txtSalesTax.Text = percent.salesTax;
                break;
        }

    }

    private void btnExit_Click(object sender, EventArgs e)
    {
        this.Close();

    }
  

Графический интерфейс InvoiceTotal:введите описание изображения здесь

frmSalesTax код:

  public partial class frmSalesTax : Form
{
    public string salesTax
    {
        get;
        set;
    }
    public frmSalesTax()
    {
        InitializeComponent();
    }

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

    }

    private void btnOk_Click(object sender, EventArgs e)
    {
        this.salesTax = txtPercent.Text;
        txtPercent.Text = "";

        Hide();


    } 
  

Я знаю, что чего-то не хватает, но я не могу понять, чего именно.

Графический интерфейс SalesTax: введите описание изображения здесь

Комментарии:

1. Тогда в чем проблема, вы никогда не устанавливаете salesTax в frmSalesTax и никогда не используете его в другой форме

2. Я установил это как процент

Ответ №1:

У вас есть правильная идея создать свойство frmSalesTax для обмена данными … но на самом деле вы его не используете.

В вашем frmInvoiceTotal вам нужно отправить текущее значение в frmSalesTax.salesTax , а затем обработать результаты, возвращаемые диалоговым окном процентов DialogResult.OK :

 private void btnChange_Click(object sender, EventArgs e)
{
    percent.salesTax = txtSalesTax.Text; //--> send current value to frmSalesTax
    switch ( percent.ShowDialog() ) //--> ShowDialog will return the DialogResult of the pressed button
    {
       case DialogResult.OK:
         txtSalesTax.Text = percent.salesTax;  //--> update with new value from frmSalesTax
         break;
    }                    
}
  

… и в вашем frmSalesTax случае вам нужно поместить txtPercent.Text в salesTax свойство, когда пользователь нажимает кнопку OK:

 private void btnOk_Click(object sender, EventArgs e)
{
    this.salesTax = txtPercent.Text;  //--> frmInvoiceTotal will read this after the OK button is clicked
    txtPercent.Text = "";

    Hide();
}
  

Важно: вы должны убедиться, что frmSalesTax кнопки имеют свой DialogResult набор, чтобы frmInvoiceTotal.btnOk_Click знать, что можно получить значение:

Свойство DialogResult

Редактировать

Свойство (в frmSalesTax ) должно не основываться на текстовых значениях формы…потому что вы устанавливаете значение «», когда форма скрывается. Это то, что вы хотите для свойства:

 public string salesTax
{ 
  get;
  set;
}
  

Это будет сопровождаться другими изменениями, о которых я упоминал ранее.

Правка 2

Легко разочароваться. Есть много движущихся частей, и я могу понять, как взгляды могут пересекаться. Вот суть проблемы — ваши вычисления сбивают вас с толку;-)

Эти строки в btnCalculate_Click :

 decimal salesTax = (7.75m/100m) *  productTotal;
decimal discountPercent = .0m;
//...
txtSalesTax.Text = salesTax.ToString("c");
txtDiscountPercent.Text = discountPercent.ToString("p1");
  

…должны быть начальными значениями и входить в код инициализации формы:

 public frmInvoiceTotal()
{
   InitializeComponent();
   decimal salesTax = (7.75m/100m) *  productTotal;
   decimal discountPercent = .0m;
   txtSalesTax.Text = salesTax.ToString("c");  //--> the initial value
   txtDiscountPercent.Text = discountPercent.ToString("p1");
}
  

… и затем, вычисление должно не повторно заполняться txtSalesTax.Text или txtDiscountPercent.Text . txtSalesTax.Текст может быть обновлен после отображения frmSalesTax , и я предполагаю, что в какой-то момент вы собираетесь создать другую форму, чтобы переопределить процент скидки.

 private void btnCalculate_Click(object sender, EventArgs e)
{
    decimal productTotal = Convert.ToDecimal(txtProductTotal.Text);
    decimal salesTax = Convert.ToDecimal(salesTax.Text) * productTotal;  //--> if it got changed in frmSalesTax
    decimal discountPercent = .0m;

    if (productTotal < 100)
        discountPercent = .0m;
    else if (productTotal >= 100 amp;amp; productTotal < 250)
        discountPercent = .1m;
    else if (productTotal >= 250)
        discountPercent = .25m;

    decimal discountAmount = (productTotal   salesTax) * discountPercent;
    decimal subtotal = productTotal - discountAmount;
    decimal invoiceTotal = (subtotal   salesTax) - discountAmount;


    txtSubtotal.Text = subtotal.ToString("c");
    //txtSalesTax.Text = salesTax.ToString("c"); //--> don't do this...it steps on what came from frmSalesTax
    //txtDiscountPercent.Text = discountPercent.ToString("p1");  //--> when you add another form to override this
    txtDiscountAmount.Text = discountAmount.ToString("c");
    txtTotal.Text = invoiceTotal.ToString("c");

    txtProductTotal.Focus();
}
  

Бьюсь об заклад, это сделает вас намного ближе 🙂

Комментарии:

1. Я сделал именно то, что вы указали, и это все равно не сработало. Поумолчанию по-прежнему отображается только налог с продаж.

2. О! Я вижу ошибку… свойство… подождите… Я отредактирую, чтобы показать

3. нет, это все еще не сработало >. < Теперь я точно расстраиваюсь из-за этого. это редактирование в frmInvoiceTotal или frmSalesTax?

4. Поместите весь ваш текущий обновленный код в вопрос … давайте посмотрим

5. У меня есть код ошибки CS1061 ‘decimal’, не содержащий определения для ‘Text’