界面与后台逻辑完全分离的方法可以防止我们绕过很多坑,避免很多错误,下面我自己总结下:
首先我们实现前台界面是这样的一个界面:实现点击添加的时候,把文本框的东西添加到list中,点击显示和添加后显示的是一样,点击新窗体的时候,实现form1 的数据。其实我们可以用一个中间的变量,传给新窗体,我们现在不用这种方法,我们用如下方法:
我们准备数据源,添加一个Testdata类,一开始的时候,我们不继承接口,只是单纯的一个Testdata类,这个数据是测试数据,插入代码:
public class Testdata : ITruedata//测试数据
{
List _datas = new List() {"test 1","test 2"};public void Add(stringitem)
{
_datas.Add("test" +item);
}public string[] Select()
{return_datas.ToArray();
}
}
form1的后台代码逻辑,为了方便,我把整个代码拷贝下来,添加了注释说明,输入如下代码:
///
///界面与数据完全分离。form1到form2,保留数据,///
public partial classForm1 : Form
{publicForm1()
{
InitializeComponent();
}
//方法改变只要更改这个声明即可,不需要修改其他的,实现了完全分离
ITruedata data=MyClass.data;
ITruedata data1=MyClass.data1;///
///添加按钮///
///
///
private void BtnAdd_Click(objectsender, EventArgs e)
{//load
data.Add(DateTime.Now.ToString());//show
listBox1.DataSource =data.Select();
}///
///显示按钮///
///
///
private void BtnShow_Click(objectsender, EventArgs e)
{
listBox1.DataSource=data.Select();
}///
///新窗体按钮///
///
///
private void BtnWin_Click(objectsender, EventArgs e)
{
Form2 fm= newForm2();
fm.ShowDialog();
}///
///添加2///
///
///
private void button1_Click(objectsender, EventArgs e)
{
data1.Add(DateTime.Now.ToString());//show
listBox1.DataSource =data.Select();
}///
///新窗体2///
///
///
private void button2_Click(objectsender, EventArgs e)
{
Form2 fm= newForm2();
fm.ShowDialog();
}
}
我们在form2中,只有一个列表,我们把form1界面的值传给form2,
form2的代码:
public partial classForm2 : Form
{publicForm2()
{
InitializeComponent();
}
ITruedata data=MyClass.data;private void Form2_Load(objectsender, EventArgs e)
{//load
var data1 =data.Select();//show
listBox1.DataSource =data1;
}
}
我们把数据类提取成接口,只声明不实现,在派生类下实现:
public interface ITruedata //数据接口
{void Add(stringitem);string[] Select();
}
我们可以把测试数据改为真实的数据,Truedata一开始的时候也是单纯的一个类,我们不加继承接口,假如真实的数据是这样的:
public class Truedata : ITruedata//真
{
List _datas = new List() {"i'm 1","i'm 2"};public void Add(stringitem)
{
_datas.Add(item);
}public string[] Select()
{return_datas.ToArray();
}
}
最重要的一点,就是建一个类,声明静态的,保证只实例化一次,也可以用单例模式,这样才能保证新窗体的数据不改变,
public classMyClass
{旧的不提取接口
//public static Truedata data1 = new Truedata();
新的
//public static Testdata data = new Testdata();//提取接口//旧的
public static ITruedata data1 = newTruedata();//新的
public static ITruedata data = newTestdata();
}
总结如下图:上面的黑色的是很多个窗体,bag是单例模式或者是接口,下面是各种数据库的连接,这样可以实现一个程序可以实现多个数据库的切换,凑时间我写一个实现多个数据库连接的例子
最下面这个图,就是我以上的的代码总结。