2016-04-15 92 views
2

我有一个列表作为数据源的组合框。此列表包含具有其属性(名称,地址,...)的对象(客户)。 当我选择组合框的一个项目时,我想将信息(地址,邮政编码......)传递给我的窗体上的一些文本框。 在我的测试1tier应用程序中,这是正确的。 但是我正在开发的主要应用程序是基于MVP(凭借我自己的触觉)。我面临的问题是铸造。由于我的观点不知道我的模型,我不应该被允许使用(客户)。 string address = ((Customers)comboBox1.SelectedItem).CustomerAddress;MVP Winforms和文本框组合框值

1Tier测试代码:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    //getCustomers((int)comboBox1.SelectedValue); 
    //txtAddress.Text =Convert.ToString(comboBox1.SelectedValue); 
    Customers p = (Customers)comboBox1.SelectedItem; 
    string s = comboBox1.SelectedItem.ToString(); 
    string address = ((Customers)comboBox1.SelectedItem).CustomerAddress; 
    txtAddress1.Text = address; 
} 

private void Form3_Load(object sender, EventArgs e) 
{ 
    using (var emp = new EmployerEFEntities()) 
    { 
     var query = from customers in emp.Customers 
        select customers; 

     comboBox1.DisplayMember = "CustomerName"; 
     comboBox1.ValueMember = "CustomerID"; 
     comboBox1.DataSource = query.ToList(); 
    } 
} 

我一直在寻找在这几天了,但还没有来取得成功。我希望有人能给我正确的方向。

实际应用的代码:

查看:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    txtName.Text = comboBox1.SelectedValue.ToString(); 
} 

private void CustomerView_Load(object sender, EventArgs e) 
{ 
    comboBox1.DataSource = customerPresenter.getCustomers(); 
    comboBox1.DisplayMember = "CustomerName"; 
    comboBox1.ValueMember = "CustomerId"; 
} 

主持人:

public List<tbl_customer> getCustomers() 
{ 
    using (var customers = new DBCrownfishEntities()) 
    { 
     var customer = from c in customers.tbl_customer 
         select c; 

     return customer.ToList(); 
    } 
} 

回答

2

这只是实现它的一种方式。你的MVP模式可能看起来不一样。 在此实现中,视图知道演示者。有关MVP的更多信息,你可以去看看here

可以使用演示为您的客户一个包装:

public interface IPresenter 
{ 
    void Init(); 
    void SetSelectedCustomer(int customerId); 
    IEnumerable GetCustomers(); 
    string FirstName { get; set; } 
    string LastName { get; set; } 
    string Address { get; set; } 
} 

演示者必须执行INotifyPropertyChanged(并调用OnPropertyChanged在属性setter)。

public class Presenter : IPresenter, INotifyPropertyChanged 
{ 
    private readonly Repository _repository; 
    private string _firstName; 
    private string _lastName; 
    private string _address; 
    private Customer _currentCustomer; 

    public Presenter(Repository repository) 
    { 
     _repository = repository; 
    } 

    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      if (_firstName == value) return; 
      _firstName = value; 
      OnPropertyChanged(); 
     } 
    } 

    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      if (_lastName == value) return; 
      _lastName = value; 
      OnPropertyChanged(); 
     } 
    } 

    public string Address 
    { 
     get { return _address; } 
     set 
     { 
      if (_address == value) return; 
      _address = value; 
      OnPropertyChanged(); 
     } 
    } 

    public IEnumerable GetCustomers() 
    { 
     return _repository.GetAllCustomers(); 
    } 

    public void Init() 
    { 
     var result = _repository.GetAllCustomers(); 
     SetSelectedCustomer(result[0].Id); 
    } 

    public void SetSelectedCustomer(int customerId) 
    { 
     var customer = _repository.GetCustomerById(customerId); 
     FirstName = customer.FirstName; 
     LastName = customer.LastName; 
     Address = customer.Address; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

这是视图的样子:

public partial class Form1 : Form 
{ 
    private IPresenter _presenter; 
    private bool _initialized; 

    public Form1(IPresenter presenter) 
    { 
     InitializeComponent();   
     _presenter = presenter; 
     _presenter.Init(); 
     SetComboBoxData(_presenter.GetCustomers()); 
     _initialized = true; 
    } 

    public void SetComboBoxData(IEnumerable data) 
    { 
     comboBox1.DataSource = data; 
     comboBox1.ValueMember = "Id"; 
     comboBox1.DisplayMember = "FirstName"; 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e) 
    { 
     if (!_initialized) return; 
     _presenter.SetSelectedCustomer((int)comboBox1.SelectedValue); 
    } 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     textBox1.DataBindings.Add(new Binding("Text", _presenter, nameof(_presenter.FirstName))); 
     textBox2.DataBindings.Add(new Binding("Text", _presenter, nameof(_presenter.LastName))); 
     textBox3.DataBindings.Add(new Binding("Text", _presenter, nameof(_presenter.Address))); 
    } 
} 

可以设置在演示中选择客户编号,从您的组合框的SelectedIndexChanged事件:

_presenter.SetSelectedCustomer((int)comboBox1.SelectedValue); 

中的SetSelectedCustomer方法您的Presenter(或者SelectedCustomerChanged事件的EventHandler)选择具有给定CustomerId的客户并设置名字,姓氏和地址:

public void SetSelectedCustomer(int customerId) 
{ 
    var customer = _repository.GetCustomerById(customerId); 
    FirstName = customer.FirstName; 
    LastName = customer.LastName; 
    Address = customer.Address; 
} 

你应该做你的绑定在的Form_Load文本框:

textBox1.DataBindings.Add(new Binding("Text", _presenter, nameof(_presenter.FirstName))); 
textBox2.DataBindings.Add(new Binding("Text", _presenter, nameof(_presenter.LastName))); 
textBox3.DataBindings.Add(new Binding("Text", _presenter, nameof(_presenter.Address))); 
0

如果你是绝对反对让你以你的域对象的访问 - 那些代表数据表行(这取决于它们有多重,在某些情况下可能会好) - 您可能需要考虑使用DTO。请检查this以了解考虑事项的完整说明以及执行此操作的一种方法。请注意在底部提及Automapper。这是一个很棒的工具。

编辑:我只是意识到你对WinForms解决方案感兴趣,而不是一个用于ASP.NET。尽管上面的链接涉及ASP.NET,但对于Winforms应用程序来说,这个想法是一样的。