r-C#在文本框更改时自动更新图表

本文关键字:更新 文本 r-C# | 更新日期: 2023-09-27 18:27:42

我有一个由一系列文本框和一个按钮组成的windows窗体。用户需要在文本框中输入一些数据,然后代码使用这些输入进行一些计算。然后,用户单击按钮,生成一个图表,显示计算结果。该图表使用R完成,R通过R.Net.连接到C#

问题是:一旦用户更改了其中一个文本框中的某些输入,我如何使图表动态更新(因此无需首先单击生成图表的按钮)?

我想我需要一些循环来不断检查是否有任何文本框被更改,但我无法做到这一点:

foreach (Control subctrl in this.Controls)
    {
        if (subctrl is TextBox)
        {
            ((TextBox)subctrl).TextChanged += new EventHandler();
        }
    }

TextChanged应该触发buttonClick事件,以便执行生成图形的已创建代码。解决这个问题的好方法是什么?谢谢

<lt<lt;编辑>>>>

这是我的表单代码:

public partial class myInputForm : Form
{
    public myInputForm()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e) 
    {
       // call methods to run calculations using new inputs from textboxes
       plotGraph(); // plot the new results
    }
}

我想将计算方法和绘图函数plotGraph保留在button_Click事件中。

为了采纳拒绝L的建议,我在上面的部分类myInputForm中添加了以下内容:

private void TextBox_TextChanged(object sender, EventArgs e)
{
    TextBox textbox = sender as TextBox;
    if (IsValidText(textBox.Text)) 
    {
         textbox.TextChanged += new System.EventHandler(this.button1_Click);
    }
    else
    {
    DisplayBadTextWarning(textBox.Text);
    }
}

private void myInputForm_Load(object sender, EventArgs e)
{
    foreach (Control control in this.Controls)
    {
        var textBox = control as TextBox;
        if (textBox != null)
        {
            textBox.TextChanged += TextBox_TextChanged;
        }
    }
 } 

但这仍然不起作用。如果我插入以下内容:

this.myFirstBox.textChanged += new System.EventHandler(this.button1_Click);

它直接在表单设计器自动生成的代码中工作,文本框myFirstBox中的更改会触发按钮单击,从而触发绘图。但我需要为每个文本框写一行,因为foreach在那里不起作用。你能解释一下如何在我的表格中设置这个吗?谢谢

r-C#在文本框更改时自动更新图表

您只需指定一个要处理事件的现有方法。理想情况下,你应该有一个单独的方法来更新图表,可以从任何地方调用。然后,您可以从TextChanged或Button_Click事件调用它,但这两个控制事件并没有绑定在一起(在TextChanged中,您可能希望首先对文本进行一些验证)。此外,如果你想从其他地方更新图表,你可以调用一个独立的方法来完成

例如,如果您使用以下方法更新图表:

private void UpdateChart()
{
    // Do something here to update the chart
}

您可以从事件处理程序调用它:

private void button1_Click(object sender, EventArgs e)
{
    UpdateChart();
}
private void TextBox_TextChanged(object sender, EventArgs e)
{
    // You might have some data validation on the TextBox.Text here, 
    // which you wouldn't need in the Button_Click event
    TextBox textbox = sender as TextBox;
    if (IsValidText(textBox.Text)) 
    {
        // Now update the chart
        UpdateChart();
    }
    else
    {
        DisplayBadTextWarning(textBox.Text);
    }
}

然后,您可以将所有TextBox.TextChanged事件连接到上面的自定义处理程序:

private void Form1_Load(object sender, EventArgs e)
{
    // Dynamically hook up all the TextBox TextChanged events to your custom method
    foreach (Control control in this.Controls)
    {
        var textBox = control as TextBox;
        if (textBox != null)
        {
            textBox.TextChanged += TextBox_TextChanged;
        }
    }
}