更新表单之间的可视数据

本文关键字:可视 数据 之间 表单 更新 | 更新日期: 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在一个变量currentPersonlistViewPersons_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适用于耦合相当松散、需要在多个类之间扩展、支持不同数量的订阅者和/或与常规事件队列没有任何连接的情况。但也许我错了…