如何使用C#在WinForms中从另一个窗体刷新用户控件?

gxwragnw  于 2023-01-09  发布在  C#
关注(0)|答案(1)|浏览(322)

我已经尝试了几种方法来实现这一点。其中使用以下代码:
第一个月
然而这实际上什么也没做。从我所读到的来看,这是因为我不应该使用表单的一个新示例。但是所有建议的方法,比如使用var UserControlee = new UserControl (this);,都不起作用。
顺便说一下,我通过SQL插入数据,目前尝试使用load()方法,当在UserControl上使用该方法时,它会工作并刷新DataGridView。

z0qdvdin

z0qdvdin1#

您的问题是How To Refresh User Control From Another Form In WinForms Using 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();

        // 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();
        }
    }
}

定制的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}: Your custom SQL load code goes here";
    }
}

相关问题