界面與後臺邏輯徹底分離的方法能夠防止咱們繞過不少坑,避免不少錯誤,下面我本身總結下:數據庫
首先咱們實現前臺界面是這樣的一個界面:實現點擊添加的時候,把文本框的東西添加到list中,點擊顯示和添加後顯示的是同樣,點擊新窗體的時候,實現form1 的數據。其實咱們能夠用一箇中間的變量,傳給新窗體,咱們如今不用這種方法,咱們用以下方法:測試
咱們準備數據源,添加一個Testdata類,一開始的時候,咱們不繼承接口,只是單純的一個Testdata類,這個數據是測試數據,插入代碼:spa
public class Testdata : ITruedata//測試數據 { List<string> _datas = new List<string>() { "test 1","test 2"}; public void Add(string item) { _datas.Add("test" + item); } public string[] Select() { return _datas.ToArray(); } }
form1的後臺代碼邏輯,爲了方便,我把整個代碼拷貝下來,添加了註釋說明,輸入以下代碼:3d
/// <summary> /// 界面與數據徹底分離。form1到form2,保留數據, /// </summary> public partial class Form1 : Form { public Form1() { InitializeComponent(); }
//方法改變只要更改這個聲明便可,不須要修改其餘的,實現了徹底分離 ITruedata data = MyClass.data; ITruedata data1 = MyClass.data1; /// <summary> /// 添加按鈕 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnAdd_Click(object sender, EventArgs e) { //load data.Add(DateTime.Now.ToString()); //show listBox1.DataSource = data.Select(); } /// <summary> /// 顯示按鈕 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnShow_Click(object sender, EventArgs e) { listBox1.DataSource = data.Select(); } /// <summary> /// 新窗體按鈕 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnWin_Click(object sender, EventArgs e) { Form2 fm = new Form2(); fm.ShowDialog(); } /// <summary> /// 添加2 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { data1.Add(DateTime.Now.ToString()); //show listBox1.DataSource = data.Select(); } /// <summary> /// 新窗體2 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { Form2 fm = new Form2(); fm.ShowDialog(); } }
咱們在form2中,只有一個列表,咱們把form1界面的值傳給form2,code
form2的代碼:orm
public partial class Form2 : Form { public Form2() { InitializeComponent(); } ITruedata data =MyClass.data; private void Form2_Load(object sender, EventArgs e) { //load var data1 = data.Select(); //show listBox1.DataSource = data1; } }
咱們把數據類提取成接口,只聲明不實現,在派生類下實現:blog
public interface ITruedata //數據接口 { void Add(string item); string[] Select(); }
咱們能夠把測試數據改成真實的數據,Truedata一開始的時候也是單純的一個類,咱們不加繼承接口,假如真實的數據是這樣的:繼承
public class Truedata : ITruedata//真 { List<string> _datas = new List<string>() { "i'm 1","i'm 2"}; public void Add(string item) { _datas.Add(item); } public string[] Select() { return _datas.ToArray(); } }
最重要的一點,就是建一個類,聲明靜態的,保證只實例化一次,也能夠用單例模式,這樣才能保證新窗體的數據不改變,接口
public class MyClass { ////舊的不提取接口 //public static Truedata data1 = new Truedata(); ////新的 //public static Testdata data = new Testdata(); //提取接口 //舊的 public static ITruedata data1 = new Truedata(); //新的 public static ITruedata data = new Testdata(); }
總結以下圖:上面的黑色的是不少個窗體,bag是單例模式或者是接口,下面是各類數據庫的鏈接,這樣能夠實現一個程序能夠實現多個數據庫的切換,湊時間我寫一個實現多個數據庫鏈接的例子string
最下面這個圖,就是我以上的的代碼總結。