#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();
}
Я знаю, что чего-то не хватает, но я не могу понять, чего именно.
Комментарии:
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
знать, что можно получить значение:
Редактировать
Свойство (в 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’