C# WPF 从另一个窗口刷新列表框

Jas*_*per 5 c# wpf refresh

我正在制作一个基于 Access 数据库的 WPF 项目。数据库有两个表:

  • tblMovies(MovieID:PK、标题、导演、类型等)
  • tblActors(ActorID:PK、MovieID:FK、名字、姓氏等)

我有一个列表框,可以在其中查看所有电影,如果单击其中一部电影,它会显示一个新窗口,其中包含该电影的所有详细信息:标题、导演、类型,还有演员。

在此窗口中,我添加了一个按钮来创建新演员。这将打开一个新窗口,您可以在其中输入 MovieID (FK) 和有关演员的信息。当我单击“保存更改”时,它会起作用并且窗口关闭,但我的 listboxActors 需要手动刷新(我为此添加了一个按钮)才能看到新的 actor。

在我的其他窗口中单击“保存更改”后,有没有办法刷新我的 listboxActors ?

我首先通过单击“添加新演员”时关闭第一个屏幕来做到这一点,然后如果我保存,它将重新打开屏幕,并且它会自动刷新,但我不希望那样。

我的列表框演员:

        listBoxActors.ItemsSource = mov.Actors;
Run Code Online (Sandbox Code Playgroud)

保存按钮(在另一个屏幕中)

    private void buttonSaveNewActor_Click(object sender, RoutedEventArgs e)
        {
            Actor act = new Actor();
            act.MovieID = Convert.ToInt32(textBoxMovieID.Text);
            act.FirstName = textBoxFirstName.Text;
            act.LastName = textBoxLastName.Text;
            act.Country = textBoxCountry.Text;
            act.Born = Convert.ToDateTime(BornDate.SelectedDate);
            act.Bio = textBoxBio.Text;
            ActorRepository.AddActor(act);
            MessageBox.Show("The actor: " + act.FirstName + " " + act.LastName + " has been created");
            this.Hide();
        }
Run Code Online (Sandbox Code Playgroud)

刷新按钮:

    private void buttonRefresh_Click(object sender, RoutedEventArgs e)
    {
        listBoxActors.ItemsSource = null;
        listBoxActors.ItemsSource = mov.Actors;
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢!

suj*_*lil 3

嗯,感谢您的解释性评论......!我有一个建议给你,请告诉我这是否有助于你编写你的场景:

因此,您有两个表单WindowShowDetails,让它成为主表单,并WindowAddActor成为子表单,它们将是主表单中的一个按钮,用于打开子表单,并且您正在子表单中执行一些任务,然后按“保存”按钮,这将保存这些详细信息并关闭该表单。您想要刷新主窗体中与此事件关联的列表。为此,您可以使用委托和事件;为此,您必须在主窗体和子窗体中执行许多任务,让我向您展示它如何帮助您:

  • 在主窗体中定义一个委托:

    public delegate void RefreshList();
    
    Run Code Online (Sandbox Code Playgroud)
  • 定义该委托类型的事件

    public event RefreshList RefreshListEvent;
    
    Run Code Online (Sandbox Code Playgroud)
  • 定义一个执行该操作的方法(即刷新网格)

    private void RefreshListView()
    {
        // Code to refresh the grid
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在需要在中定义一个委托WindowAddActor

    公共委托 UpdateActor;

  • 现在我们必须对打开表单的按钮单击进行编码 假设WindowAddActor按钮是btnAddActor这样,那么它的 Click 事件就是btnAddActor_click,我们必须初始化我们的委托事件,即 的实例,WindowAddActor并在显示该表单之前将事件分配给 Delegate WindowAddActor。这可以编码为:

     private void btnAddActor_click(object sender, EventArgs e)
     {
          WindowAddActor actorInstance = new WindowAddActor();      
          RefreshListEvent += new RefreshList(RefreshListView); // event initialization
          actorInstance.UpdateActor =  RefreshListEvent; // assigning event to the Delegate
          actorInstance.Show(); 
     }
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在我们必须从 SaveButton 的单击事件调用委托,即

    private void buttonSaveNewActor_Click(object sender, RoutedEventArgs e)
    {
       // Perform save operation 
       UpdateActor.DynamicInvoke(); this will call the `RefreshListView` method of mainWindow
    
       this.Close();
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 我花了一段时间才明白发生了什么,因为我不熟悉 Delegate,但我让它工作了。非常感谢您的时间和深入的指导! (2认同)
  • 没关系..很高兴为您提供帮助 (2认同)