更新表单之间的可视数据
本文关键字:可视 数据 之间 表单 更新 | 更新日期: 2023-09-27 18:05:12
我有一个ListView。ListView的每个项都链接到一个对象(类)。我想更新其他形式的对象数据上点击一个项目。所以我实现了可观察模式。接口:
public interface IObserver
{
void Update(object obj);
}
public interface IObservable
{
void AddObserver(IObserver observer);
void NotifyObservers(object obj);
void RemoveObserver(IObserver observer);
}
主要形式:
public partial class MainForm : Form, IObservable
{
public MainForm()
{
InitializeComponent();
}
PersonDataForm pdfrm;
private List<IObserver> _Observers = new List<IObserver>();
private void MainForm_Load(object sender, EventArgs e)
{
Person pers1 = new Person { FirstName = "John", LastName = "Smith", ID = 307566438, Company = "EMG", Position = "Manager" };
Person pers2 = new Person { FirstName = "Jack", LastName = "Broun", ID = 308567430, Company = "EMG", Position = "Accounter" };
Person pers3 = new Person { FirstName = "Lisa", LastName = "Mishli", ID = 307316432, Company = "EMG", Position = "Teller" };
ListViewItem item1 = new ListViewItem { Text = pers1.FirstName, Tag = pers1 };
ListViewItem item2 = new ListViewItem { Text = pers2.FirstName, Tag = pers2 };
ListViewItem item3 = new ListViewItem { Text = pers3.FirstName, Tag = pers3 };
listViewPersons.Items.Add(item1);
listViewPersons.Items.Add(item2);
listViewPersons.Items.Add(item3);
pdfrm = new PersonDataForm();
AddObserver(pdfrm);
pdfrm.Show();
}
public void AddObserver(IObserver observer)
{
_Observers.Add(observer);
}
public void NotifyObservers(object obj)
{
foreach (var observer in _Observers)
{
observer.Update(obj);
}
}
public void RemoveObserver(IObserver observer)
{
_Observers.Remove(observer);
}
private void listViewPersons_Click(object sender, EventArgs e)
{
NotifyObservers(this. listViewPersons.SelectedItems[0].Tag as Person); }
public void Update(object obj)
{
Person pers = obj as Person;
listViewPersons.SelectedItems[0].Text = pers.FirstName;
}
}
子表单:
public partial class PersonDataForm : Form, IObserver
{
public PersonDataForm()
{
InitializeComponent();
}
public void Update(object obj)
{
Person pers = obj as Person;
textBoxFirstName.Text = pers.FirstName;
textBoxLastName.Text = pers.LastName;
}
}
很好。在MainForm中单击一个项目,PersonDataForm中的文本框就会更新。但我怎样才能逆转呢?在PersonDataForm的文本框中更改文本,我想更改MainForm的项目数据。我应该在每个表单中实现IObservable和IObserver吗?看起来很乱。也许有更好的方法?
这都是设计的问题。如果你的设计应该首先实现一个IObservable
模式,那么,是的,你已经得到了答案:它应该是双向工作的。
但是:为什么你首先要使用这个复杂的模式呢?你正在编写一个GUI程序。这意味着所有事件都是由用户单击树并按下子表单中的apply按钮触发的;所以系统做了所有你需要的观察。
假设您将person的每个实例存储为ListViewItem.Tag
,那么简单地在PersonDataForm中编写一个函数是否足够并且更容易:
public void displayPerson(ListViewItem aPerson )
{
if (currentPerson.Tag is person)
{
currentPerson= aPerson;
textBox1.Text = ((person)currentPerson.Tag).firstName;
textBox2.Text = ((person)currentPerson.Tag).lastName;
}
显示数据在文本框和存储ListViewItem
在一个变量currentPerson
和listViewPersons_Click
上调用?
你可以在你的应用按钮中加入像
这样简单的代码private void cb_apply_Click(object sender, EventArgs e)
{
if (currentPerson!= null)
{
((person)currentPerson.Tag).firstName = textBoxFirstName.Text;
((person)currentPerson.Tag).lastName = textBoxLastName.Text;
curPerson.Text = ((person)currentPerson.Tag).ToString();
}
}
你的两个表单是紧密耦合的,一个是为了直接支持另一个。
正如所理解的那样,IObservable适用于耦合相当松散、需要在多个类之间扩展、支持不同数量的订阅者和/或与常规事件队列没有任何连接的情况。但也许我错了…