#c# #winforms
#c# #winforms
Вопрос:
У меня есть текстовые поля Количество, цена и общее количество, все они генерируются динамически.
Я не уверен, как вычислить их по событию изменения текста.
Я создал события TextChanged для txtBox3 и txtBox4, которые соответствуют количеству и цене соответственно. не уверен, как захватить, умножить их и отобразить в динамически генерируемом итоговом текстовом поле.
TextBox txtBox3 = new TextBox();
txtBox3 = new TextBox();
txtBox3.Location = new Point(313, position);
txtBox3.Visible = true;
txtBox3.Name = "txt_QTY" qtyTextbox;
txtBox3.TextChanged = txtBox3_TextChanged;
txtBox3.KeyPress = txtBox3_KeyPress;
qtyTextbox ;
TextBox txtBox4 = new TextBox();
txtBox4 = new TextBox();
txtBox4.Location = new Point(447, position);
txtBox4.Visible = true;
txtBox4.Name = "txt_Price" priceTextbox;
txtBox4.TextChanged = txtBox4_TextChanged;
txtBox4.KeyPress = txtBox4_KeyPress;
priceTextbox ;
TextBox txtBox5 = new TextBox();
txtBox5 = new TextBox();
txtBox5.Location = new Point(556, position);
txtBox5.Visible = true;
txtBox5.Name = "txt_Total" totalTextbox;
totalTextbox ;
panel1.Controls.Add(txtBox3);
panel1.Controls.Add(txtBox4);
panel1.Controls.Add(txtBox5);
private void txtBox4_TextChanged(object sender, EventArgs e)
{
}
private void txtBox3_TextChanged(object sender, EventArgs e)
{
}
Как мне вычислить кол-во из динамического текстового поля * Цена из динамического текстового поля и показать его в динамически генерируемом текстовом поле Total в их событии textchanged.
Ответ №1:
Вы должны добавить свой динамический элемент управления в коллекцию элементов управления
int controlCounts = 0;
private void addControls_Click(object sender, EventArgs e)
{
controlCounts ;
TextBox txt_QTY = new TextBox();
txt_QTY.Location = new Point(100 * controlCounts, 100);
txt_QTY.Name = "txt_QTY" controlCounts;
Controls.Add(txt_QTY);
txt_QTY.TextChanged = txt_QTY_TextChanged;
TextBox txt_Price = new TextBox();
txt_Price.Location = new Point(100 * controlCounts, 200);
txt_Price.Name = "txt_Price" controlCounts;
Controls.Add(txt_Price);
txt_Price.TextChanged = txt_Price_TextChanged;
TextBox txt_Total = new TextBox();
txt_Total.Location = new Point(100 * controlCounts, 300);
txt_Total.Name = "txt_Total" controlCounts;
Controls.Add(txt_Total);
}
private void txt_QTY_TextChanged(object sender, EventArgs e)
{
TextBox txt_QTY = (TextBox)sender;
string index = txt_QTY.Name.Substring("txt_QTY".Length);
updateTotal(index);
}
private void txt_Price_TextChanged(object sender, EventArgs e)
{
TextBox txt_Price = (TextBox)sender;
string index = txt_Price.Name.Substring("txt_Price".Length);
updateTotal(index);
}
private void updateTotal(string index)
{
TextBox txt_QTY = (TextBox)Controls["txt_QTY" index];
TextBox txt_Price = (TextBox)Controls["txt_Price" index];
TextBox txt_Total = (TextBox)Controls["txt_Total" index];
if ((txt_QTY.Text != "") amp;amp; (txt_Price.Text != ""))
{
txt_Total.Text = (Convert.ToInt32(txt_QTY.Text) * Convert.ToInt32(txt_Price.Text)).ToString();
}
}
Комментарии:
1. да, я добавляю их в коллекцию элементов управления, я забыл упомянуть об этом в своем вопросе. Мне нужно вычислить количество текстовых полей, а не только одно. когда я создаю текстовые поля, я изменяю их значение Name на txtBox4.Name = «txt_Price» priceTextbox;
2. Элементы управления(TextBox) [«txt_QTY» index] выдают мне null при updateTotal. однако оно показывает правильное значение индекса.
3. о, извините, вы должны обновить его имя, прежде чем добавлять его в коллекцию элементов управления. Я обновил свой ответ
Ответ №2:
Вот полная версия:
//Add tag
String tag = "";
TextBox txtBox3 = new TextBox();
txtBox3 = new TextBox();
txtBox3.Location = new Point(313, position);
txtBox3.Visible = true;
txtBox3.Name = "txt_QTY" qtyTextbox;
txtBox3.TextChanged = txtBox3_TextChanged;
txtBox3.KeyPress = txtBox3_KeyPress;
tag = "txt_QTY" qtyTextbox;
qtyTextbox ;
TextBox txtBox4 = new TextBox();
txtBox4 = new TextBox();
txtBox4.Location = new Point(447, position);
txtBox4.Visible = true;
txtBox4.Name = "txt_Price" priceTextbox;
txtBox4.TextChanged = txtBox4_TextChanged;
txtBox4.KeyPress = txtBox4_KeyPress;
tag = "," "txt_Price" priceTextbox;
priceTextbox ;
TextBox txtBox5 = new TextBox();
txtBox5 = new TextBox();
txtBox5.Location = new Point(556, position);
txtBox5.Visible = true;
txtBox5.Name = "txt_Total" totalTextbox;
totalTextbox ;
tag = "," "txt_Total" totalTextbox;
//Set same tag into three 3 textbox
txtBox3.Tag = txtBox4.Tag = txtBox5.Tag = tag;
Add a parse function:
private TextBox[] getTextBoxFromTag(String Tag)
{
TextBox [] arrTextBox = new [3] TextBox();
String arrTag[] = Tag.Split(",");
//Harcode
arrTextBox[0] = GetControlByName(this, arrTag[0]);
arrTextBox[1] = GetControlByName(this, arrTag[1]);
arrTextBox[2] = GetControlByName(this, arrTag[2]);
return arrTextBox;
}
public Control GetControlByName(Control ParentCntl, string NameToSearch)
{
if (ParentCntl.Name == NameToSearch)
return ParentCntl;
foreach (Control ChildCntl in ParentCntl.Controls)
{
Control ResultCntl = GetControlByName(ChildCntl, NameToSearch);
if (ResultCntl != null)
return ResultCntl;
}
return null;
}
void updateTotal(object sender){
String tag = ((TextBox)sender).Tag;
TextBox [] txt = getTextBoxFromTag(tag);
txt[2].Text = Convert.ToInt32(txt[0].Text) * Convert.ToInt32(txt[1].Text);
}
private void txt_QTY_TextChanged(object sender, EventArgs e)
{
updateTotal(sender);
}
private void txt_Price_TextChanged(object sender, EventArgs e)
{
updateTotal(sender);
}
Комментарии:
1. GetControlByName(arrTag[0]); выдает ошибку, в которой говорится, что для этого требуется 2 аргумента. что мне делать?
2. Я просто редактирую код, добавляю «это» к первому параметру.
3. все еще не выводит значение в общем текстовом поле. возвращается значение, но ошибка ссылки на объект в arrTextBox[0] = GetControlByName(this, arrTag[0]);
4. Добавляли ли вы элементы управления в форму, например: this.controls.add(txtBox3); this.controls.add (txtbox4и); this.controls.add(txtBox5)?
5. да, я добавляю элементы управления, и они отображаются при их создании
Ответ №3:
Сначала реализуйте функцию управления поиском, например:
public Control GetControlByName(Control ParentCntl, string NameToSearch)
{
if (ParentCntl.Name == NameToSearch)
return ParentCntl;
foreach (Control ChildCntl in ParentCntl.Controls)
{
Control ResultCntl = GetControlByName(ChildCntl, NameToSearch);
if (ResultCntl != null)
return ResultCntl;
}
return null;
}
Затем вы можете получить общее текстовое поле:
TextBox txtTotal = (TextBox) this.GetControlByName(this, "txt_Total" totalTextbox);
TextBox txtPrice = (TextBox) this.GetControlByName(this, "txt_Price" priceTextbox);
Комментарии:
1. Спасибо за ваш быстрый ответ на это. Я только что попробовал этот код, но он никогда не возвращает «ResultCntl». В принципе, я хочу показать общее количество * цена в общем текстовом поле.
2. Я добавил новый ответ!