在我的主窗口中,我创建了一个执行while()循环的线程。主要任务包括两部分:从套接字接收数据并在GUI上显示。
现在我需要同时在另一个窗口上显示数据。所以我先创建它,如下所示。
ShowForm showForm = new ShowForm();
public MainWindow()
{
InitializeComponent();
mainThread();
showForm.Show();
}
并将数据发送到showForm,如下所示:(在主窗口中生成coordinateValue
)
showForm.setter(coordinateValue);
在ShowForm.Designer.cs的代码中:
int xValue;
public void setter(int val)
{
xValue = val;
}
现在我不知道如何反复在showForm上显示xValue(需要及时更新),例如textBox或将xValue转换为坐标并在pictureBox上显示它。同时,主窗口的while()循环应继续接收数据并在其GUI上显示。
有人可以帮忙吗?谢谢!
答案 0 :(得分:0)
您可以在MainWindow中创建活动。并在ShowForm中订阅该事件。
比数据更改时,MainWindow应该引发该事件。请记住,如果您在另一个线程中获取数据,则不能将其传递给在主线程上运行的GUI。在这种情况下,您将需要使用Dispatcher。
答案 1 :(得分:0)
您可能想要使用Timer
类。它可以偶数间隔执行方法(Tick事件)。
答案 2 :(得分:0)
我写了一个示例,解释了如何使用事件将数据从一个表单传输到另一个表单。如果它在另一个线程中运行,您应该在控件中使用Invoke方法来防止错误。
public partial class AdditionalForm : Form
{
private Label l_dataToShow;
public Label DataToShow { get { return l_dataToShow; } }
public AdditionalForm()
{
InitializeComponent();
SuspendLayout();
l_dataToShow = new Label();
l_dataToShow.AutoSize = true;
l_dataToShow.Location = new Point(12, 9);
l_dataToShow.Size = new Size(40, 13);
l_dataToShow.TabIndex = 0;
l_dataToShow.Text = "Data will be shown here";
Controls.Add(l_dataToShow);
ResumeLayout();
}
}
public partial class MainForm : Form
{
private AdditionalForm af;
public MainForm()
{
InitializeComponent();
SuspendLayout();
txtbx_data = new TextBox();
txtbx_data.Location = new System.Drawing.Point(12, 12);
txtbx_data.Name = "txtbx_data";
txtbx_data.Size = new System.Drawing.Size(100, 20);
txtbx_data.TabIndex = 0;
Controls.Add(txtbx_data);
ResumeLayout();
txtbx_data.TextChanged += new EventHandler(txtbx_data_TextChanged);
af = new AdditionalForm();
af.Show();
}
/// <summary>
/// The data that contains textbox will be transfered to another form to a label when you will change text in a textbox. You must make here your own event that will transfer data.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtbx_data_TextChanged(object sender, EventArgs e)
{
af.DataToShow.Text = txtbx_data.Text;
}
}