2010-05-27 33 views
2

我在C#中创建了一个WinForm应用程序,它的一个功能是在文本框中显示文本。我正在编写查询单独的类中的数据库的逻辑,并且无法访问我正在创建的类中的文本框元素(我得到的“名称”在当前上下文错误中不存在)。我是否将所有表单逻辑放入Form1.cs文件中?正确的表单应用程序设计

回答

3

您应该尽量让显示逻辑与应用程序的其余部分分开 - 最简单的方法就是让表单类处理获取/设置表单值。这意味着您的数据访问组件将查询数据库,并且表单必须将输出映射到可以显示的内容,例如,

public class Form1 : Form 
{ 
    public DataAccess Db { get; set; } 

    public void UpdateSomething() 
    { 
     this.textbox.Text = this.Db.GetSomeDatabaseValue(); 
    } 
} 
+0

这个简单的例子很有意义,谢谢! – sooprise 2010-05-27 13:21:44

0

如果他们不尝试将属性中的修饰符设置为public或internal。

编辑 - 编辑,以适应答案格式

+2

这应该是一条评论。 – 2010-05-27 13:14:04

+0

是否通过字段“修饰符”设置?如果是的话,我尝试设置公共和内部的“修饰符”,并且都没有工作... – sooprise 2010-05-27 13:16:55

0

如果您要访问的文本框在另一大类更改访问修饰符为

公开或内部的(如果是在相同的程序集)

。 默认它是私人的

更好的是你可以将价值传递给业务逻辑层。不是整个控制,总是不好。

B.I是做所有的业务,所以文本框的价值就够了。

+0

我是OOP的超级新手,你能解释一下业务逻辑层的含义吗? 商业逻辑是否在一个单独的类中,并且形式文件中的GUI逻辑? – sooprise 2010-05-27 13:19:58

1

除了UI逻辑之外,不保留业务逻辑。您应该在Business类中引发一个事件并在UI表单中捕获它。从那里显示它。

0

你看过backgroundworker?有了这个,你可以在你单击表单上的一个按钮时异步运行。您表单上的所有更新内容都将在您的表单上完成。您的其他代码(您无法访问Form1)将“报告进度”。当报告进度时,您可以发送任何想要Form1的对象,然后在表单上的事件处理程序中,您可以从该对象获取信息并更新视图。例如,您可以使用它来更新进度条,同时保持UI的响应。

0

我们目前正在用winforms做一个MVP模式的应用程序。我们在winforms中使用绑定,以便UI在数据执行时更新。我们的表单使用BindingSources和BindingLists。我们将主BindingSource绑定到我们的演示者类。表单代码隐藏的

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

using SomeNameSpace.Utilities.UI; 
using SomeNameSpace.Utilities.Validation; 

namespace Management.UI 
{ 
    public partial class ManualControl : UserControl, IManualRaffleView 
    { 


     private ManualPresenter _presenter; 

     public ManualControl() 
     { 
      InitializeComponent(); 
     } 


     [Browsable(false)] 
     public ManualPresenter Presenter 
     { 
      get 
      { 
       return _presenter; 
      } 
      set 
      { 
       _presenter = value; 
       if(_presenter != null) 
       { 
        _manualPresenterBindingSource.DataSource = _presenter; 
        _ListBindingSource.DataSource = _presenter; 
        _ListBindingSource.DataMember = "Something"; 
        _KindListBindingSource.DataSource = _presenter; 
        _KindListBindingSource.DataMember = "SomethingElse"; 

        _presenter.CloseView += new Action(CloseMe); 
        _presenter.VerifyingCancel += new Func<bool>(VerifyingCancel); 
        _presenter.Showing += new Action(ShowMe); 
        _presenter.Synchronizer = this; 
       } 
      } 
     } 


     void CloseMe() 
     { 
      this.Enabled = false; 
     } 

     private void ManualRaffleForm_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      e.Cancel = false; 
     } 

     private void ShowMe() 
     { 
      this.Enabled = true; 
     } 

     bool VerifyingCancel() 
     { 
      return MessageBox.Show("Cancel?", Notifier.ApplicationName, 
       MessageBoxButtons.YesNo, MessageBoxIcon.Question, 
       MessageBoxDefaultButton.Button2) == DialogResult.Yes; 
     } 

     private void _cancelButton_Click(object sender, EventArgs e) 
     { 
      Presenter.HandleCancel(); 
     } 

     private void _initiateButton_Click(object sender, EventArgs e) 
     { 
      Presenter.HandleInitiate(); 
     } 

     private void _saveButton_Click(object sender, EventArgs e) 
     { 
      if(Presenter.Error == true.ToString()) 
       Presenter.HandleDone(); 
      else 
       _manualPresenterBindingSource.ResetBindings(false); 
     } 

    } 
} 

然后我们演示实现INotifyPropertyChanged,并可能是这个样子

namespace SomeCompany.UI 
    { 
    public class ManualPresenter : INotifyPropertyChanged, IDataErrorInfo 
     { 
      #region Fields 
        //fields 
        #endregion Fields 

        public string SomeFormField 
        { get{ return _someFormField;} 
         set{ 
          if(_someFormField != value) 
           { 
           _someFormField = value; 
            //Update Model if Needed 
            _model.SomeFormField = _someFormField; 
           NotifyCHanged("SomeFormField"); 
           } 
          } 
        } 

的格式文本框将绑定到主持人的属性和任何列表框或组合框将绑定到BindingLists。 然后,我们对我们的模型使用Linq to Sql。表格中的逻辑很少。大部分只是验证所需的一点点。