英文:
How To Refresh User Control From Another Form In WinForms Using C#?
问题
我已经尝试了几种方法来实现这个目标。其中一种方法是使用以下代码:
var UserControlee = new UserControl();
UserControlee.load_data();
然而,这实际上什么都没有做。根据我所了解,这是因为我不应该使用窗体的新实例。但是所有建议的方法,比如使用 var UserControlee = new UserControl(this);
都不起作用。
顺便说一下,我通过SQL插入我的数据,目前尝试使用 load()
方法,当在UserControl上使用时,它可以工作并刷新DataGridView。
英文:
I have tried several ways now to achieve this. Amongst other things using this code:
var UserControlee = new UserControl ();
UserControlee .load_data();
this however does literally nothing. From what I have read this is because I should not use a new instance of the form. But all the suggested ways like using var UserControlee = new UserControl (this);
don't work.
I by the way insert my data through SQL and currently trie to use the method load(), which works and refreshes the DataGridView when used on UserControl.
答案1
得分: 0
你的问题是关于如何在WinForms中使用C#从另一个窗体刷新用户控件。在你的问题中缺少调试详细信息。尽管如此,一种通用的做法是在需要刷新时,让请求窗体触发一个事件。
以下是一个示例代码,演示了一个名为MainForm
的主窗体,其中包含一个用于触发此事件的[Refresh]按钮。主窗体还创建了承载UserControl
的第二个窗体。
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
buttonRefresh.Click += onClickButtonRefresh;
ucHost = new UserControlHostForm(this);
}
UserControlHostForm ucHost;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ucHost.StartPosition = FormStartPosition.Manual;
ucHost.Location = new Point(Location.X + Width + 10, Location.Y);
ucHost.Show();
}
private void onClickButtonRefresh(object? sender, EventArgs e)
{
RefreshNeeded?.Invoke(this, EventArgs.Empty);
}
public event EventHandler? RefreshNeeded;
}
第二个窗体在其构造方法中订阅了主窗体的事件,并在响应事件时调用了myUserControl.Refresh()
。
public partial class UserControlHostForm : Form
{
public UserControlHostForm(Form owner)
{
Owner = owner;
InitializeComponent();
// 如果UserControl尚未在设计时添加,请在此处添加。
myUserControl = new MyUserControl
{
BackColor = Color.LightBlue,
Dock = DockStyle.Fill,
};
Controls.Add(myUserControl);
// 订阅主窗体事件
((MainForm)Owner).RefreshNeeded += onRefreshNeeded;
}
MyUserControl myUserControl;
private void onRefreshNeeded(object? sender, EventArgs e)
{
myUserControl.Refresh();
Visible = true;
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
if (e.CloseReason.Equals(CloseReason.UserClosing))
{
e.Cancel = true;
Hide();
}
}
}
自定义的UserControl
以应用程序特定的方式实现了Control.Refresh()
方法,例如通过调用load()
。以下是一个模拟实现,演示了它是如何工作的。
class MyUserControl : UserControl
{
public MyUserControl()
{
Controls.Add(label);
}
public new void Refresh()
{
base.Refresh();
load();
}
Label label = new Label { Location = new Point(10, 100), AutoSize = true, };
int debugCount = 0;
private void load()
{
label.Text = $"Count = {++debugCount}: 你的自定义SQL加载代码在这里";
}
}
这些代码组成了一个简单的示例,演示了如何从一个窗体刷新另一个窗体中的用户控件。
英文:
Your question is How To Refresh User Control From Another Form In WinForms Using C#. The debugging details are missing in your question. Nevertheless, a general answer for one way of doing that is to have the requesting form fire an event when a refresh is needed.
Here is a minimal example of a MainForm
that features a [Refresh] button to test fire this event. The main form also creates the second form that hosts the UserControl
.
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
buttonRefresh.Click += onClickButtonRefresh;
ucHost = new UserControlHostForm(this);
}
UserControlHostForm ucHost;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ucHost.StartPosition = FormStartPosition.Manual;
ucHost.Location = new Point(Location.X + Width + 10, Location.Y);
ucHost.Show();
}
private void onClickButtonRefresh(object? sender, EventArgs e)
{
RefreshNeeded?.Invoke(this, EventArgs.Empty);
}
public event EventHandler? RefreshNeeded;
}
The second form subscribes to the main form event in its constructor method and calls myUserControl.Refresh()
in response.
public partial class UserControlHostForm : Form
{
public UserControlHostForm(Form owner)
{
Owner = owner;
InitializeComponent();
// If the UserControl hasn't already been
// added in the Designer, add it here.
myUserControl = new MyUserControl
{
BackColor = Color.LightBlue,
Dock = DockStyle.Fill,
};
Controls.Add(myUserControl);
// Subscribe to the MainForm event
((MainForm)Owner).RefreshNeeded += onRefreshNeeded;
}
MyUserControl myUserControl;
private void onRefreshNeeded(object? sender, EventArgs e)
{
myUserControl.Refresh();
Visible = true;
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
if (e.CloseReason.Equals(CloseReason.UserClosing))
{
e.Cancel = true;
Hide();
}
}
}
The custom UserControl
implements the Control.Refresh()
method in an app-specific manner, for example by calling load(). Here is a mock implementation that demonstrates that it's working.
class MyUserControl : UserControl
{
public MyUserControl()
{
Controls.Add(label);
}
public new void Refresh()
{
base.Refresh();
load();
}
Label label = new Label { Location = new Point(10, 100), AutoSize = true, };
int debugCount = 0;
private void load()
{
label.Text = $"Count = {++debugCount}: Your custom SQL load code goes here";
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论