我正在制作一个基于 Access 数据库的 WPF 项目。 数据库有两个表:
- tblMovies (MovieID: PK, Title, Director, Genre etc)
- tblActors (ActorID: PK, MovieID: FK, Firstname, Lastname etc)
我有一个列表框,我可以在其中查看所有电影,如果我点击其中一部电影,它会显示一个新窗口,其中包含有关该电影的所有详细信息:片名、导演、类型以及 Actor 。
在这个窗口中,我添加了一个按钮来创建一个新的 Actor 。这将打开一个新窗口,您可以在其中输入 MovieID (FK) 和有关 Actor 的信息。 当我单击保存更改时,它起作用并且窗口关闭,但我的 listboxActors 需要手动刷新(我为此添加了一个按钮)才能看到新 Actor 。
在我的其他窗口中单击“保存更改”后,是否有办法刷新我的 listboxActor?
我首先通过点击添加新 Actor 时关闭我的第一个屏幕来做到这一点,然后如果我保存它会重新打开屏幕,它会自动刷新,但我不希望那样。
我的 listboxActors:
listBoxActors.ItemsSource = mov.Actors;
保存按钮(在另一个屏幕上)
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();
}
刷新按钮:
private void buttonRefresh_Click(object sender, RoutedEventArgs e)
{
listBoxActors.ItemsSource = null;
listBoxActors.ItemsSource = mov.Actors;
}
提前致谢!
最佳答案
好吧,感谢您的解释性评论...!我有一个建议给你,如果这对你编写场景代码有帮助,请告诉我:
所以你有两个窗体 WindowShowDetails
让它成为主窗体而 WindowAddActor
成为子窗体,它们将是主窗体中打开子窗体的按钮表单,并且您正在子项中执行一些任务并按下保存按钮,这将保存这些详细信息并关闭该表单。并且您想刷新与此事件关联的主窗体中的列表。为此,您可以使用委托(delegate)和事件;为此,您必须在主窗体和子窗体中执行许多任务,让我向您展示它如何帮助您:
在主窗体中定义一个委托(delegate):
public delegate void RefreshList();
定义该委托(delegate)类型的事件
public event RefreshList RefreshListEvent;
定义一个方法来执行操作(即刷新网格)
private void RefreshListView() { // Code to refresh the grid }
现在需要在
中定义一个DelegateWindowAddActor
公共(public)代表 UpdateActor;
现在我们必须编写打开
WindowAddActor
表单的按钮点击代码 让按钮为btnAddActor
因此它的点击事件将为btnAddActor_click
,我们必须初始化我们的委托(delegate)事件,即WindowAddActor
的实例,并在显示该表单之前将事件分配给WindowAddActor
中的委托(delegate)。这可以编码为: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(); }
现在我们必须从 SaveButton 的点击事件调用委托(delegate)
private void buttonSaveNewActor_Click(object sender, RoutedEventArgs e) { // Perform save operation UpdateActor.DynamicInvoke(); this will call the `RefreshListView` method of mainWindow this.Close(); }
关于C# WPF 从另一个窗口刷新列表框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41420633/