Как вычислить значения из 2 динамических текстовых полей и отобразить в третьем динамическом текстовом поле?

#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. Я добавил новый ответ!