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在那里不起作用。你能解释一下如何在我的表格中设置这个吗?谢谢
您只需指定一个要处理事件的现有方法。理想情况下,你应该有一个单独的方法来更新图表,可以从任何地方调用。然后,您可以从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;
}
}
}