我正在制作一个基于 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)
提前致谢!
嗯,感谢您的解释性评论......!我有一个建议给你,请告诉我这是否有助于你编写你的场景:
因此,您有两个表单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)