轻松关联控件C#

时间:2019-02-09 05:43:04

标签: c# .net winforms event-handling

我有一列包含10个文本框,另一列包含10个标签。我希望每个Label是其左侧TextBox与常数K(在TextBox完成时)之间的乘积。

我在想一种方法来编写一个函数来处理文本框Leave的所有事件,并更改关联的标签。

是否有一种简单的方法就可以知道要更改哪个Label而无需将发送者与每个TextBoxt进行比较?

我希望我能使自己理解,在此先感谢

4 个答案:

答案 0 :(得分:1)

使用TableLayoutPanel

使用TableLayoutPanel,将所有文本框添加到第一列,并将所有标签添加到第二列。然后使用一个事件处理程序处理所有文本框的Validating事件。

const int K = 10;
private void TextBoxes_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
    var txt = (TextBox)sender;
    if (int.TryParse(txt.Text, out int value))
    {
        var row = tableLayoutPanel1.GetRow(txt);
        var lbl = tableLayoutPanel1.GetControlFromPosition(1, row);
        lbl.Text = $"{value * K}";
    }
}

您可以使用TableLayoutPanel方法根据位置查找控件,也可以使用GetRowGetColumnGetPositionFromControlGetControlFromPosition查找控件的位置

使用DataGridView

另一种选择是使用绑定到DataGridView的{​​{1}}控件。 DataTable可以有一个int列和一个expression列。

DataTable

要了解表达式格式,请查看DataColumn.Expression

答案 1 :(得分:1)

我将使用几个数组,并执行以下操作:

var labels = new[] { label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, };
var textBoxes = new[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10, };

for (int i = 0; i < 10; i++)
{
    var textBox = textBoxes[i];
    var label = labels[i];
    textBox.Leave += (_s, _e) => label.Text = (double.Parse(textBox.Text) * 3.14159).ToString();
}

答案 2 :(得分:1)

制作包含1个TextBox和1个Lable的新对象 在此新对象中编写所有函数和处理程序 在项目中使用此新对象,而不是标准TextBox和Lable 它们每个都可以单独工作,不需要为它们编写任何控制代码

答案 3 :(得分:0)

给他们一个共同的阶级。为此创建一个JavaScript处理程序,并使用$(this)访问事件中的特定文本框。要访问标签,您可以使用.Closest()函数。