如何在C#中按字符串访问EventHandler中的Form文本框?

时间:2017-08-24 13:24:18

标签: c# winforms controls

我正在使用Visual Studio 2017.有一个带有文本框的表单。这些文本框需要每10秒刷新一次。为实现这一目标,我使用了Timer事件。

public partial class status_window : Form
{
    public status_window()
    {
        InitializeComponent();

        shutdown_button.Click += new EventHandler(shutdown_click);

        Timer timer = new Timer();
        timer.Interval = (1 * 10000); // 10 secs
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();

    }
}

timer_tick函数是status_window类的成员。在eventhandler里面,我可以按照预期的名称访问文本框。但是,如果文本框"地址"我是变数。看:

private void timer_Tick(object sender, EventArgs e)
{

    Int32 unixtime = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

    // for all boxes per exname
    for (int i = 0; i < something.Count() ; i++)
    {

        //  try to find textbox 1 -> embty result
        Console.WriteLine( this.Controls.Find("nam1_last_event", true) );
        Console.WriteLine( this.Controls.Find("nam2_last_event", true) );   //  also empty result

        //  this works and fills the formbox as ecxpected
        nam1_last_event.Text = "somevalue";
        nam1_event_count.Text = "anothervale";
        nam2_last_event.Text = "somemorevalue";
        nam2_event_count.Text = "andsoon";

        //  thats what i want later to use my for loop for those:
        //  something[i] exuals to nam1,nam2 and so on
        this.Controls.Find( String.Format("{0}_last_event", something[i].ToLower()) , true)[0].Text = "somevalue";  //  this fails cause array returned by find is empty
        this.Controls.Find(String.Format("{0}_last_event", ex_name.ToLower()), true)[0].Text = "anothervale";   //  same

    }

}

所以我在某种程度上被我自己的知识所限制。 Google上的大多数结果都建议使用控件查找方法。

3 个答案:

答案 0 :(得分:0)

在您的代码中,您使用同等名称nam1_last_event作为类status_window的成员和控件名称。如果您的控制继电器名称为nam1_last_event,请检查设计人员。

函数Controls.Find使用key,它是控件的属性Name的值。

答案 1 :(得分:0)

创建一个列表或Dictionary变量来保存这些文本框,并在timer_Tick中获取它。

答案 2 :(得分:0)

这对我有用:

var inPanel = this.Controls.Find("inPanel", true).OfType<TextBox>().FirstOrDefault();
inPanel?.Text = "Found it";
相关问题