当另一个表单中的提交按钮被点击时,如何在C#中重新加载表单?

3

我在C#的表单frmMain中放置了一个组合框,当我在设置表单frmSettings中添加产品(使用按钮button1_Click)时,该组合框会自动填充。当我单击button1_Click按钮时,我希望重新加载frmMain,以便新添加的产品可见。

我尝试使用

frmMain main = new frmMain();
main.Close();
main.Show();

我知道这段代码很有趣,但它没有起作用。 :D
这是Windows表单!
编辑
请看我程序的这个图像以更好地理解。这是我的frmMain。
在这里是我设置的frmSettings表格。因此,当我单击提交按钮时,我希望使frmMain重新加载,以便将添加到设置的更新值可见于frmMain comboBox。

4
你为什么要重新加载整个表单?为什么不只更新下拉框呢? - DerApe
你的意思是要添加另一个按钮来更新组合框吗?需要单独编写代码吗?但我想在我的表单中添加几个按钮,实际上我已经有一个按钮了,所以如果我再添加一个用于更新的按钮,就会有两个按钮,我不喜欢我的表单上充满了按钮。 - Jayseer
实际上,我还有一个数据网格视图需要重新加载以显示我的数据库的更新。 - Jayseer
1
@NetStarter this.Refresh() 不会重置数值。 - Shaharyar
1
是的,它不起作用。 - Jayseer
显示剩余5条评论
10个回答

6

更新:由于您修改了问题,这是更新版本以更新您的产品

这是您的产品表单:

private frmMain main;

public frmSettings(frmMain mainForm)
{
  main = mainForm;
  InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
  main.AddProduct(textBox1.Text);
}

需要在构造函数中传递数据到主表单。

而主表单:

private frmSettings settings;
private List<string> products = new List<string>();

public frmMain()
{
  InitializeComponent();
  //load products from somewhere
}

private void button1_Click(object sender, EventArgs e)
{
  if (settings == null)
  {
    settings = new frmSettings(this);
  }
  settings.Show();
}

private void UpdateForm()
{
  comboBoxProducts.Items.Clear();
  comboBoxProducts.Items.AddRange(products.ToArray());

  //Other updates
}

public void AddProduct(string product)
{
  products.Add(product);
  UpdateForm();
}

您可以随时从表单上的任何位置调用UpdateForm(),例如另一个按钮。此示例仅使用本地变量存储产品。添加产品时还缺少某些检查,但我想您已经明白了...


2
this.Close();
frmMain main = new frmMain();
main.Show();

3
如果您简要解释您的答案而不仅仅提供代码,将会很有帮助。 - Manish Mahajan

1
this.Refresh();
Refresh();
this.Hide();
frmScholars ss = new frmScholars();
ss.Show();

1

没有内置方法可以按您的要求设置所有值。正如我在评论中提到的,您应该创建一个具有所有控件所需设置的方法,以下是示例代码:

private void ReloadForm()
{
    comboBox.ResetText();
    dataGridView.Update();   
    //and how many controls or settings you want, just add them here
}

private void button1_Click(object sender, EventArgs e)
{
    ReloadForm();   //and call that method on your button click
}

我会尝试,但我不想重置comboBox,只想重新加载它。 - Jayseer
先试一下,再问问题。这只是重新加载并删除用户选择的项目,而不是清除项目。如果您想要清除项目,请使用 comboBox1.Items.Clear() - Shaharyar
@Jayseer,您所说的“update”是什么意思?您想要提供什么行为? - DerApe
我有一个单独的表单用于我的设置。 - Jayseer
1
你的数据从哪里进入gridview?来自任何数据库吗? - Shaharyar
如果您正在使用 TableAdapterBindingSource 从数据库检索数据并将其填充到网格视图中,则可以使用以下代码,并将其替换为您的名称:this.productsTableAdapter.Fill(this.DataSet.products); - Shaharyar

1
尝试运行这段代码。
this.Refresh();
Application.Doevents();

0
不需要重新加载整个表单。只需为表单初始化创建一个函数。 您可以随时调用此函数。这将刷新表单。
private void acc_Load(object sender, EventArgs e)
{
     form_Load();           
}

public void form_Load()
{
    // write form initialise codes example listView1.Clear();...
}

private void button1_Click(object sender, EventArgs e) //edit account
{
    //Do something then refresh form
    form_Load(); 

}

0

如果您想从用户控件刷新页面。这里是一个示例,我正在从用户控件刷新表单。 找到此重新加载按钮所在的表单。 然后调用使TabControl失效并刷新它。

Dim myForm As Form = btnAuthorise.FindForm()

For Each c As Control In myForm.Controls
                If c.Name = "tabControlName" Then
                    DirectCast(c, System.Windows.Forms.TabControl).Invalidate()
                    DirectCast(c, System.Windows.Forms.TabControl).Refresh() 'force the call to the drawitem event
                End If
 Next


0

如果您想在单击另一个表单的按钮时自动更新其他表单的值,可以使用计时器控件。只需将计时器设置为0.5秒,以便快速更新表单。


-1

我认为,当你点击按钮时调用frmMain_load(sender,e)应该重新加载表单。

你也可以像@Nahum说的那样尝试Invalidate()表单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接