国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

在.net中輕松掌握Windows窗體間的數(shù)據(jù)交互

2024-07-10 13:05:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最大的網(wǎng)站源碼資源下載站,

windows 窗體是用于 microsoft windows 應(yīng)用程序開發(fā)的、基于 .net framework 的新平臺(tái)。此框架提供一個(gè)有條理的、面向?qū)ο蟮摹⒖蓴U(kuò)展的類集,它使您得以開發(fā)豐富的 windows 應(yīng)用程序。一個(gè)windows窗體就代表了.net架構(gòu)里的system.windows.forms.form類的一個(gè)實(shí)例。

作者在csdn技術(shù)論壇.net板塊下的c#分類經(jīng)常看到有人問起如何在兩個(gè)form間傳遞數(shù)據(jù),訪問修改對(duì)方窗體里面的值。對(duì)于有經(jīng)驗(yàn)的程序員來(lái)說不是什么高深的東西,而對(duì)于初學(xué)者來(lái)說這些基礎(chǔ)的東西往往是一個(gè)問題,并且存在這種現(xiàn)象,往往比較復(fù)雜的東西他們會(huì),要用什么了就去學(xué)什么,實(shí)際上并沒有真正的去理解掌握它,基礎(chǔ)不扎實(shí),所以就有了想通過自己對(duì)窗體編程積累的經(jīng)驗(yàn)來(lái)寫一些這方面的文章,以供學(xué).net的朋友參考,也借此機(jī)會(huì)同各位朋友進(jìn)行交流,寫得不合理的地方請(qǐng)各位朋友提寶貴意見,下面我分了三個(gè)部分來(lái)講。

一.使用帶參數(shù)的構(gòu)造函數(shù)
我們要做的準(zhǔn)備工作就是新建兩個(gè)窗體,下面是兩個(gè)窗體的布局,很簡(jiǎn)單:

<第一個(gè)例子>

說明:form1為主窗體,包含控件:文本框textboxfrm1,多選框checkboxfrm1和按鈕buttonedit;

form2為子窗體,包含控件:文本框textboxfrm2,多選框checkboxfrm2和按鈕buttonok,buttoncancel。

當(dāng)我們新建一個(gè)窗體的時(shí)候,設(shè)計(jì)器會(huì)生成默認(rèn)的構(gòu)造函數(shù):

public form2()

{

initializecomponent();

}

它不帶參數(shù),既然我們要把form1中的一些數(shù)據(jù)傳到form2中去,為什么不在form2的構(gòu)造函數(shù)里做文章呢?

假設(shè)我們要實(shí)現(xiàn)使form2中的文本框顯示form1里textboxfrm1的值,修改子窗體的構(gòu)造函數(shù):

public form2(string text)

{

initializecomponent();

this.textboxfrm2.text = text;

}

增加form1中的修改按鈕點(diǎn)擊事件,處理函數(shù)如下:

private void buttonedit_click(object sender, system.eventargs e)

{

form2 formchild = new form2(this.textboxfrm1.text);

formchild.show();

}

我們把this.textboxfrm1.text作為參數(shù)傳到子窗體構(gòu)造函數(shù),以非模式方式打開,這樣打開的formchild的文本框就顯示了”主窗體”文本,是不是很簡(jiǎn)單,接下來(lái)我們傳一個(gè)boolean數(shù)據(jù)給子窗體。

public form2(string text,bool checkedvalue)

{

initializecomponent();

this.textboxfrm2.text = text;

this.checkboxfrm2.checked = checkedvalue;

}

在主窗體中的修改按鈕點(diǎn)擊處理,我采用了打開模式窗口的方式,其實(shí)在這個(gè)例子中看不出有什么分別,

private void buttonedit_click(object sender, system.eventargs e)

{

form2 formchild = new form2(this.textboxfrm1.text,this.checkboxfrm1.checked);

formchild.showdialog();

}

結(jié)果在預(yù)料之中,但是這里明顯存在不足,在子窗體里的數(shù)據(jù)修改后不能傳給主窗體,也就是說主窗體不受子窗體的影響。而在實(shí)際的開發(fā)過程中我們經(jīng)常使用子窗體來(lái)修改主窗體里面的數(shù)據(jù),那怎么解決呢?

在.net中有兩種類型,值類型和引用類型。值類型是從valuetype繼承而來(lái),而valuetype又是從object繼承;對(duì)于引用類型它直接繼承object類型。這下讓我們看看怎樣通過form2來(lái)修改form1里的數(shù)據(jù)。

還是讓我們來(lái)修改form2的代碼。

private textbox textboxfrm12;

private checkbox checkboxfrm12;

public form2(textbox heckbo,checkbox heckbox)

{

initializecomponent();

this.textboxfrm2.text = heckbo.text;

this.checkboxfrm2.checked = heckbox.checked;

this.textboxfrm12 = heckbo;

this.checkboxfrm12 = heckbox;

}

現(xiàn)在我們傳了兩個(gè)引用類型的數(shù)據(jù):textbox類型,和checkbox;另外在form2中增加了兩個(gè)類數(shù)據(jù)成員textboxfrm12、checkboxfrm12用來(lái)分別保存構(gòu)造函數(shù)傳來(lái)的變量,不過他們并不屬于form2的controls容器。修改form2的確定按鈕點(diǎn)擊事件函數(shù):

private void buttonok_click(object sender, system.eventargs e)

{

this.textboxfrm12.text = this.textboxfrm2.text;

this.checkboxfrm12.checked = this.checkboxfrm2.checked;

this.close();

}

上面的代碼我們通過把textboxfrm2的text和checkboxfrm2.checked賦給textboxfrm12和checkboxfrm12完成了對(duì)主窗體中的textboxfrm1和checkboxfrm2的修改,因?yàn)閠extboxfrm1和textboxfrm12是同一個(gè)引用,而checkboxfrm2和checkboxfrm12也是。

到這里為止功能是實(shí)現(xiàn)了,但是總覺得不是很合理,讓兩個(gè)窗體控件傳來(lái)傳去,現(xiàn)在我舉一個(gè)恰當(dāng)一點(diǎn)的例子。

修改了兩個(gè)窗體:

<第二個(gè)例子>

說明:在這個(gè)例子中我們的兩個(gè)窗體都加了一個(gè)listbox用來(lái)顯示arraylist中的內(nèi)容。

主窗體中控件:listboxfrm1,buttonedit;

子窗體中控件:listboxfrm2,textboxadd,buttonadd,buttonedit,buttonok。

這次我們用arraylist來(lái)作為傳遞數(shù)據(jù),在form1中定義類數(shù)據(jù)成員:

private arraylist listdata1;

在構(gòu)造函數(shù)中增加了對(duì)listdata1進(jìn)行內(nèi)存分配,并生成數(shù)據(jù)最終綁定到listboxfrm1,

public form1()

{

initializecomponent();

this.listdata1 = new arraylist();

this.listdata1.add("dotnet");

this.listdata1.add("c#");

this.listdata1.add("asp.net");

this.listdata1.add("webservice");

this.listdata1.add("xml");

this.listboxfrm1.datasource = this.listdata1;

}

另外,對(duì)修改按鈕點(diǎn)擊事件處理函數(shù)的修改如下:

private void buttonedit_click(object sender, system.eventargs e)

{

form2 formchild = new form2(this.listdata1);

formchild.showdialog();

this.listboxfrm1.datasource = null;

this.listboxfrm1.datasource = this.listdata1;

}

相對(duì)與主窗體,對(duì)子窗體作相應(yīng)修改,也在form2中增加了類數(shù)據(jù)成員:

private arraylist listdata2;

用來(lái)保存對(duì)主窗體中l(wèi)istdata1的引用。

修改構(gòu)造函數(shù):

public form2(arraylist listdata)

{

initializecomponent();

this.listdata2 = listdata;

foreach(object o in this.listdata2)

{

this.listboxfrm2.items.add(o);

}

}

這里讓listdata2同listdata1指向同一個(gè)引用;另外沒有對(duì)listboxfrm進(jìn)行綁定,采用了填充。

好了,下面是對(duì)數(shù)據(jù)操作的時(shí)候了。

添加處理函數(shù)代碼如下:

private void buttonadd_click(object sender, system.eventargs e)

{

if(this.textboxadd.text.trim().length>0)

{

this.listdata2.add(this.textboxadd.text.trim());

this.listboxfrm2.items.add(this.textboxadd.text.trim());

}

else

messagebox.show("請(qǐng)輸入添加的內(nèi)容!");

}

刪除處理代碼如下:

private void buttondel_click(object sender, system.eventargs e)

{

int index = this.listboxfrm2.selectedindex;

if(index!=-1)

{

this.listdata2.removeat(index);

this.listboxfrm2.items.removeat(index);

}

else

messagebox.show("請(qǐng)選擇刪除項(xiàng)或者沒有可刪除的項(xiàng)!");

}

退出form2子窗體:

private void buttonok_click(object sender, system.eventargs e)

{

this.close();

}

編譯運(yùn)行程序,在子窗體中對(duì)數(shù)據(jù)進(jìn)行修改,關(guān)閉后,主窗體就會(huì)顯示更新后的數(shù)據(jù)。

這里有一點(diǎn)要提醒一下,比較兩個(gè)例子,我們都傳的是引用類型,一個(gè)是string,另一個(gè)是arraylist,為什么string類型不能修改主窗體的數(shù)據(jù)呢?其實(shí)在.net中對(duì)string類型的修改并不是修改原來(lái)的值,原來(lái)的值沒有變化,而是重新生成一個(gè)新的字符串,下面是一個(gè)很好的說明。

public class zzconsole

{

[stathread]

static void main(string[] args)

{

string str1 = "abc";

string str2 = str1;

str1 = "123";

console.writeline(str1);

console.writeline("--------------");

console.writeline(str2);

console.writeline("--------------");

arraylist al1 = new arraylist();

al1.add("abc");

arraylist al2 = al1;

al2.add("123");

foreach(object o in al1)

console.writeline((string)o);

console.writeline("--------------");

foreach(object o in al2)

console.writeline((string)o);

console.readline();

}

}

運(yùn)行一下看看輸出結(jié)果就明白了,另外對(duì)值類型的數(shù)據(jù)操作要使用ref關(guān)鍵字。

總結(jié),我們通過帶參數(shù)的構(gòu)造函數(shù)實(shí)現(xiàn)了窗體間的數(shù)據(jù)交互,代碼看上去也比較清楚,在實(shí)際開發(fā)過程中,可以把dataset,datatable,或者是dataview當(dāng)作參數(shù),當(dāng)然如果只是想修改一行,可以傳個(gè)datarow或者datarowview。在下面的文章中我們來(lái)看看怎樣使用另外兩種方法來(lái)實(shí)現(xiàn)數(shù)據(jù)的交互。


二.給窗體添加屬性或方法

1.使用form類的owner屬性

獲取或設(shè)置擁有此窗體的窗體。若要使某窗體歸另一個(gè)窗體所有,請(qǐng)為其 owner 屬性分配一個(gè)對(duì)將成為所有者的窗體的引用。當(dāng)一個(gè)窗體歸另一窗體所有時(shí),它便隨著所有者窗體最小化和關(guān)閉。例如,如果 form2 歸窗體 form1 所有,則關(guān)閉或最小化 form1 時(shí),也會(huì)關(guān)閉或最小化 form2。并且附屬窗體從不顯示在其所有者窗體后面。可以將附屬窗體用于查找和替換窗口之類的窗口,當(dāng)選定所有者窗體時(shí),這些窗口不應(yīng)消失。若要確定某父窗體擁有的窗體,請(qǐng)使用ownedforms屬性。

上面是sdk幫助文檔上講的,下面我們就來(lái)使用它。

首先還是使用第一篇文章中的第二個(gè)例子,窗體如下:

說明:在這個(gè)例子中我們的兩個(gè)窗體都加了一個(gè)listbox用來(lái)顯示arraylist中的內(nèi)容。

主窗體中控件:listboxfrm1,buttonedit;

子窗體中控件:listboxfrm2,textboxadd,buttonadd,buttonedit,buttonok。

主窗體中還是定義類數(shù)據(jù)成員,

private arraylist listdata1;

在構(gòu)造函數(shù)里實(shí)例化它,填充數(shù)據(jù),最后綁定到listboxfrm1。

構(gòu)造函數(shù)如下:

public form1()

{

initializecomponent();

this.listdata1 = new arraylist();

this.listdata1.add("dotnet");

this.listdata1.add("c#");

this.listdata1.add("asp.net");

this.listdata1.add("webservice");

this.listdata1.add("xml");

this.listboxfrm1.datasource = this.listdata1;

}

主窗體的修改按鈕處理函數(shù):

private void buttonedit_click(object sender, system.eventargs e)

{

form2 formchild = new form2();

formchild.owner = this;

formchild.showdialog();

this.listboxfrm1.datasource = null;

this.listboxfrm1.datasource = this.listdata1;

}

我們?cè)O(shè)置了formchild.owner為this,這樣,子窗體和主窗體就有聯(lián)系了,

當(dāng)然我們也可以改成如下:

private void buttonedit_click(object sender, system.eventargs e)

{

form2 formchild = new form2();

formchild.showdialog(this);

this.listboxfrm1.datasource = null;

this.listboxfrm1.datasource = this.listdata1;

}

不過這樣還不行,目前主窗體的listdata1變量外部訪問不到,

private arraylist listdata1;

必須修改為public訪問修飾符,

public arraylist listdata1;

也可以通過屬性(property)來(lái)實(shí)現(xiàn),

public arraylist listdata1

{

get{return this.listdata1;}

}

這里我采用屬性,感覺語(yǔ)法更靈活,清楚。

下面是對(duì)form2的修改,

構(gòu)造函數(shù)又恢復(fù)原貌了。

public form2()

{

initializecomponent();

}

另外又新增了一個(gè)窗體的load事件,在它的事件處理函數(shù)中來(lái)獲取主窗體中的數(shù)據(jù),

private void form2_load(object sender, system.eventargs e)

{

form1 pareform = (form1)this.owner;

this.listdata2 = pareform.listdata1;

foreach(object o in this.listdata2)

this.listboxfrm2.items.add(o);

}

有人會(huì)問,為什么不把上面的代碼放到構(gòu)造函數(shù)里面去呢?如下不是更好,

public form2()

{

initializecomponent();

form1 pareform = (form1)this.owner;

this.listdata2 = pareform.listdata1;

foreach(object o in this.listdata2)

this.listboxfrm2.items.add(o);

}

那我會(huì)對(duì)你說錯(cuò)了,因?yàn)樵谥鞔绑w修改按鈕被點(diǎn)擊后,開始執(zhí)行

form2 formchild = new form2();

而在form2的實(shí)例化過程中會(huì)在構(gòu)造函數(shù)中執(zhí)行

form1 pareform = (form1)this.owner;

而這時(shí)的this.owner是沒有值的,為空引用,那么下面的代碼肯定也出問題,

this.listdata2 = pareform.listdata1;

foreach(object o in this.listdata2)

this.listboxfrm2.items.add(o);

當(dāng)整個(gè)form2實(shí)例化完成后,才會(huì)執(zhí)行

formchild.owner = this;

這條代碼,所以使用了form2_load事件。

那怎樣可以不使用form2_load事件呢?等下面我們來(lái)修改代碼實(shí)現(xiàn)它。

下面的子窗體代碼沒有變化,

private void buttonadd_click(object sender, system.eventargs e)

{

if(this.textboxadd.text.trim().length>0)

{

this.listdata2.add(this.textboxadd.text.trim());

this.listboxfrm2.items.add(this.textboxadd.text.trim());

}

else

messagebox.show("請(qǐng)輸入添加的內(nèi)容!");

}

private void buttondel_click(object sender, system.eventargs e)

{

int index = this.listboxfrm2.selectedindex;

if(index!=-1)

{

this.listdata2.removeat(index);

this.listboxfrm2.items.removeat(index);

}

else

messagebox.show("請(qǐng)選擇刪除項(xiàng)!");

}

private void buttonok_click(object sender, system.eventargs e)

{

this.close();

}

好了,結(jié)果同第一篇中的一樣,子窗體能修改主窗體的值。

2.使用自定義屬性或方法

下面我們來(lái)講講怎樣使用自定義屬性或方法來(lái)完成數(shù)據(jù)修改功能而不使用form2_load事件。

主窗體的修改按鈕點(diǎn)擊處理函數(shù)如下:

private void buttonedit_click(object sender, system.eventargs e)

{

form2 formchild = new form2();

formchild.listdata2 = this.listdata1;

formchild.showdialog();

this.listboxfrm1.datasource = null;

this.listboxfrm1.datasource = this.listdata1;

}

并且我們?nèi)サ袅酥鞔绑w的listdata1屬性,

//public arraylist listdata1

//{

// get{return this.listdata1;}

//}

而在子窗體中加上listdata2屬性,

public arraylist listdata2

{

set

{

this.listdata2 = value;

foreach(object o in this.listdata2)

this.listboxfrm2.items.add(o);

}

}

也可以把屬性改成方法,

public void setlistdata(arraylist listdata)

{

this.listdata2 = listdata;

foreach(object o in this.listdata2)

this.listboxfrm2.items.add(o);

}

而在主窗體的修改按鈕處理函數(shù)中也要相應(yīng)改動(dòng):

formchild.listdata2 = this.listdata1;

改為

formchild.setlistdata(this.listdata1);

總結(jié),我們通過form類的owner屬性來(lái)建立主從窗體間的橋梁,這個(gè)是不是類似于把主窗體作為子窗體的構(gòu)造函數(shù)參數(shù)傳入實(shí)現(xiàn)的功能差不多;另外又采用了屬性和方法來(lái)完成數(shù)據(jù)的交互,我覺得這種實(shí)現(xiàn)方法很實(shí)用,特別是用在不需要實(shí)例化類或著已經(jīng)有了實(shí)例的情況下傳遞數(shù)據(jù)。下一篇文章我們來(lái)講如何使用靜態(tài)類來(lái)完成數(shù)據(jù)的交互。

三.使用靜態(tài)類

下面是定義的一個(gè)類:

using system;

using system.collections;

namespace zz

{

public class appdatas

{

private static arraylist listdata;

static appdatas()

{

listdata = new arraylist();

listdata.add("dotnet");

listdata.add("c#");

listdata.add("asp.net");

listdata.add("webservice");

listdata.add("xml");

}

public static arraylist listdata

{

get{return listdata;}

}

public static arraylist getlistdata()

{

return listdata;

}

}

}

上面包含了一個(gè)靜態(tài)類成員,listdata,一個(gè)靜態(tài)構(gòu)造函數(shù)static appdatas(),用來(lái)初始化listdata的數(shù)據(jù)。還有一個(gè)靜態(tài)屬性listdata和一個(gè)靜態(tài)getlistdata()方法,他們實(shí)現(xiàn)了同樣的功能就是返回listdata。

由于前面兩篇文章已經(jīng)講了很多,這里不細(xì)說了,下面是完整的代碼:

form1.cs文件

using system;

using system.drawing;

using system.collections;

using system.componentmodel;

using system.windows.forms;

namespace zz

{

public class form1 : system.windows.forms.form

{

private system.windows.forms.button buttonedit;

private system.windows.forms.listbox listboxfrm1;

private system.componentmodel.container components = null;

public form1()

{

initializecomponent();

this.listboxfrm1.datasource = appdatas.listdata;



}

protected override void dispose( bool disposing )

{

if( disposing )

if(components != null)

components.dispose();

base.dispose( disposing );

}

[stathread]

static void main()

{

application.run(new form1());

}

private void initializecomponent()

{

this.buttonedit = new system.windows.forms.button();

this.listboxfrm1 = new system.windows.forms.listbox();

this.suspendlayout();

this.buttonedit.location = new system.drawing.point(128, 108);

this.buttonedit.name = "buttonedit";

this.buttonedit.tabindex = 1;

this.buttonedit.text = "修改";

this.buttonedit.click += new system.eventhandler(this.buttonedit_click);

this.listboxfrm1.itemheight = 12;

this.listboxfrm1.location = new system.drawing.point(12, 8);

this.listboxfrm1.name = "listboxfrm1";

this.listboxfrm1.size = new system.drawing.size(108, 124);

this.listboxfrm1.tabindex = 2;

this.autoscalebasesize = new system.drawing.size(6, 14);

this.clientsize = new system.drawing.size(208, 141);

this.controls.add(this.listboxfrm1);

this.controls.add(this.buttonedit);

this.name = "form1";

this.text = "form1";

this.resumelayout(false);

}

private void buttonedit_click(object sender, system.eventargs e)

{

form2 formchild = new form2();

formchild.showdialog();

this.listboxfrm1.datasource = null;

this.listboxfrm1.datasource = appdatas.listdata;

}

}

}



form2.cs文件

using system.drawing;

using system.collections;

using system.componentmodel;

using system.windows.forms;

namespace zz

{

public class form2 : system.windows.forms.form

{

private system.windows.forms.button buttonok;

private system.componentmodel.container components = null;

private system.windows.forms.listbox listboxfrm2;

private system.windows.forms.button buttonadd;

private system.windows.forms.button buttondel;

private system.windows.forms.textbox textboxadd;

public form2()

{

initializecomponent();

foreach(object o in appdatas.listdata)

this.listboxfrm2.items.add(o);

}

protected override void dispose( bool disposing )

{

if( disposing )

if(components != null)

components.dispose();

base.dispose( disposing );

}

private void initializecomponent()

{

this.buttonok = new system.windows.forms.button();

this.listboxfrm2 = new system.windows.forms.listbox();

this.buttonadd = new system.windows.forms.button();

this.buttondel = new system.windows.forms.button();

this.textboxadd = new system.windows.forms.textbox();

this.suspendlayout();

this.buttonok.location = new system.drawing.point(188, 108);

this.buttonok.name = "buttonok";

this.buttonok.tabindex = 0;

this.buttonok.text = "確定";

this.buttonok.click += new system.eventhandler(this.buttonok_click);

this.listboxfrm2.itemheight = 12;

this.listboxfrm2.location = new system.drawing.point(8, 8);

this.listboxfrm2.name = "listboxfrm2";

this.listboxfrm2.size = new system.drawing.size(168, 124);

this.listboxfrm2.tabindex = 2;

this.buttonadd.location = new system.drawing.point(188, 44);

this.buttonadd.name = "buttonadd";

this.buttonadd.tabindex = 3;

this.buttonadd.text = "增加";

this.buttonadd.click += new system.eventhandler(this.buttonadd_click);

this.buttondel.location = new system.drawing.point(188, 76);

this.buttondel.name = "buttondel";

this.buttondel.tabindex = 4;

this.buttondel.text = "刪除";

this.buttondel.click += new system.eventhandler(this.buttondel_click);

this.textboxadd.location = new system.drawing.point(188, 12);

this.textboxadd.name = "textboxadd";

this.textboxadd.size = new system.drawing.size(76, 21);

this.textboxadd.tabindex = 5;

this.textboxadd.text = "";

this.autoscalebasesize = new system.drawing.size(6, 14);

this.clientsize = new system.drawing.size(272, 141);

this.controls.add(this.textboxadd);

this.controls.add(this.buttondel);

this.controls.add(this.buttonadd);

this.controls.add(this.listboxfrm2);

this.controls.add(this.buttonok);

this.name = "form2";

this.text = "form2";

this.resumelayout(false);

}

private void buttonok_click(object sender, system.eventargs e)
{
this.close();
}

private void buttonadd_click(object sender, system.eventargs e)

{

if(this.textboxadd.text.trim().length>0)

{

appdatas.listdata.add(this.textboxadd.text.trim());

this.listboxfrm2.items.add(this.textboxadd.text.trim());

}

else

messagebox.show("請(qǐng)輸入添加的內(nèi)容!");



}

private void buttondel_click(object sender, system.eventargs e)

{

int index = this.listboxfrm2.selectedindex;

if(index!=-1)

{

appdatas.listdata.removeat(index);

this.listboxfrm2.items.removeat(index);

}

else

messagebox.show("請(qǐng)選擇刪除項(xiàng)!");

}

}

}

總結(jié),我認(rèn)為使用靜態(tài)類比較多的地方就是把應(yīng)用程序的配置文件裝載到一個(gè)靜態(tài)類里面,讓所有的窗體和其他實(shí)例都可以通過靜態(tài)屬性以及靜態(tài)方法使用這些數(shù)據(jù),比如三層結(jié)構(gòu)或多層結(jié)構(gòu)都可以訪問它,而不是在多個(gè)實(shí)例間傳來(lái)傳去。在這里我們討論的是windows窗體,其實(shí)在兩個(gè)不同的實(shí)例間交互數(shù)據(jù),都可以采用三篇文章中的方案實(shí)現(xiàn),除非是這個(gè)類特有的屬性或著方法。現(xiàn)在都講完了,雖然不是什么高深的東西,但是希望能對(duì)一些初學(xué)者有所幫助,要是能真正的能解決一些朋友的實(shí)際問題,也算是我沒有浪費(fèi)時(shí)間來(lái)寫文章,同時(shí)也歡迎各位朋友進(jìn)行技術(shù)交流,共同提高
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青田县| 勐海县| 崇义县| 武宣县| 句容市| 原平市| 公主岭市| 博客| 宣城市| 乐安县| 乌审旗| 林西县| 香河县| 绿春县| 栾川县| 苏尼特右旗| 北流市| 黑龙江省| 吴旗县| 抚州市| 广汉市| 会东县| 湘潭市| 大新县| 渑池县| 新津县| 新龙县| 四川省| 张家界市| 绥江县| 湛江市| 金门县| 高邮市| 定襄县| 偃师市| 麻江县| 和田市| 延边| 四平市| 伊金霍洛旗| 海宁市|