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

首頁 > 編程 > .NET > 正文

.NET 窗體之間的交互

2024-07-10 13:05:06
字體:
供稿:網(wǎng)友
進(jìn)行 .net 窗體編程時(shí)應(yīng)該牢牢把握下列原則:在訪問窗體之前,你必須進(jìn)行窗體實(shí)例化;如果在項(xiàng)目中有多處代碼訪問同一窗體,則你必須把它的同一實(shí)例指針傳遞給這些代碼。對(duì)于早已習(xí)慣了直接把默認(rèn)窗體實(shí)例當(dāng)成全局變量來使用的 visual basic 6.0 程序員來說,這可是個(gè)嚴(yán)重的挑戰(zhàn)。好在 .net 為你提供了兩條出路:其一,把窗體實(shí)例指針保存在全局變量中;其二,把窗體實(shí)例指針傳遞給任何需要訪問它的窗體、類、模塊或者過程。
.net 中的數(shù)值全局化
visual basic .net 不支持全局變量,然而它借助 shared (相當(dāng)于 c# 中的 static) 變量卻能模擬全局變量。事實(shí)上,前面介紹的 visual basic 升級(jí)向?qū)ё詣?dòng)添加到窗體代碼中的 definstance 屬性就是 shared 類成員。無論容納 definstance 屬性的窗體類是否已經(jīng)實(shí)例化,它都能被項(xiàng)目中的任何代碼所引用。象這樣的 shared 屬性不就相當(dāng)于全局變量嗎?因此,你可以創(chuàng)建這樣的類:
public class myforms
private shared m_customerform as customerform
public shared property customerform() as customerform
get
return m_customerform
end get
set(byval value as customerform)
m_customerform = value
end set
end property
end class
你需要在首次實(shí)例化一個(gè)窗體時(shí),把該窗體的實(shí)例保存到一個(gè)類中:
dim mynewcust as new customerform()
mynewcust.show()
myforms.customerform = mynewcust
這里的 customerform 屬性值就是你的窗體實(shí)例。于是,其它代碼就能從項(xiàng)目的任何地方通過它來間接訪問你的窗體了:
module doingstuffwithforms
sub doexcitingthings()
myforms.customerform.text = _
datetime.now().tolongtimestring
end sub
end module
象這樣把窗體實(shí)例保存為屬性值就能按照你的要求模擬 visual basic 6.0 中的全局變量。如此模擬的“全局變量”其作用域比類域 (class scope) 高一個(gè)層次。所謂類域,是指變量?jī)H僅在定義它的類(確切地說,應(yīng)該包括模塊、類或窗體)中有效。比類域還低一層次的是過程域 (procedure scope),即變量?jī)H僅在定義它的例程中有效。
窗體指針在項(xiàng)目中的傳遞
除了把窗體實(shí)例全局化以外,你還可以把窗體類指針保存在變量中傳遞給需要訪問該窗體的例程。假設(shè)你有一個(gè)窗體 form1,并希望在點(diǎn)擊 form1 中某個(gè)按鈕 (button1) 時(shí)打開另第二窗體 form2 ,然后在點(diǎn)擊第二窗體 form2 中的另一個(gè)按鈕 (button2) 時(shí)進(jìn)行某項(xiàng)計(jì)算。你可以把整個(gè)代碼都寫在 form1 中,即:
public class form1
inherits system.windows.forms.form
dim myform2 as form2

private sub button1_click(byval sender as system.object, _
byval e as system.eventargs) handles button1.click
myform2 = new form2()
myform2.show()
end sub

private sub button2_click(byval sender as system.object, _
byval e as system.eventargs) handles button2.click
calculations.compoundinterestcalc(myform2)
end sub
end class
無論是把窗體指針全局化,還是把它以參數(shù)的形式傳遞,都是可行的。然而,你必須根據(jù)項(xiàng)目的需要選擇最佳方案。當(dāng) .net 項(xiàng)目中只有少數(shù)幾個(gè)過程需要訪問特定窗體時(shí),我建議你給這些過程增加一個(gè)參數(shù),以在必要時(shí)接受窗體指針。當(dāng)你的項(xiàng)目有太多過程需要訪問該窗體時(shí),你就應(yīng)該考慮設(shè)置一個(gè)全局窗體指針變量。當(dāng)然了,你最好還是考慮調(diào)整項(xiàng)目代碼結(jié)構(gòu),使得真正訪問該窗體的類或者過程只有一個(gè)。如果你希望用窗體來顯示登錄信息,則你可以先創(chuàng)建一個(gè)類,把窗體實(shí)例保存為它的 shared 類成員,然后添加一個(gè) shared 方法 writetologwindow 來完成實(shí)際的窗體訪問。于是,項(xiàng)目中的任何代碼只需調(diào)用此 writetologwindow 方法就能間接訪問顯示登錄信息的窗體了:
public class log
private shared m_logform as form2
public shared property logform() as form2
get
return m_logform
end get
set(byval value as form2)
m_logform = value
end set
end property

public shared sub writetologwindow(byval message as string)
dim sb as new _
stringbuilder(m_logform.txtloginfo.text)
sb.append(environment.newline)
sb.append(message)
m_logform.txtloginfo.text = sb.tostring()
end sub
end class
讀取和改變窗體內(nèi)的信息
到現(xiàn)在為止,我們討論的只是如何創(chuàng)建和訪問窗體實(shí)例,而沒有涉及如何讀取或改變窗體內(nèi)的信息。如果你的窗體已經(jīng)按照前述方法實(shí)例化,并且訪問窗體的代碼都位于窗體所在的項(xiàng)目中,則你可以直接操作窗體中的任何控件來讀取和改變窗體內(nèi)的信息。但我覺得這樣并不理想。與其直接訪問窗體中的文本框、按鈕等控件,還不如增加一個(gè) public 屬性,通過它來控制窗體中的控件。如果你有意嘗試這種特殊的窗體訪問方式,請(qǐng)跟我來:
在 visual basic .net 中新建一個(gè) windows 應(yīng)用程序項(xiàng)目。
此時(shí)項(xiàng)目中已經(jīng)自動(dòng)生成了一個(gè)窗體 form1 。現(xiàn)在添加另一個(gè)窗體 form2 :在“解決方案資源管理器”中按右鍵單擊項(xiàng)目名稱 -> “添加” -> “添加 windows 窗體” -> 點(diǎn)擊“打開”以接受默認(rèn)名稱 form2.vb 。
在 form1 中添加兩個(gè)按鈕,分別按照默認(rèn)值命名為 button1 和 button2 ,并且調(diào)整它們?cè)诖绑w中的位置以免重疊。
在 form2 中添加一個(gè)簡(jiǎn)單文本框,按照默認(rèn)值命名為 textbox1
把下列代碼添加到 form2 的“end class”前面 (在“解決方案資源管理器”中按右鍵單擊 “form2”-> “查看代碼”,再粘貼下列代碼):
public property customername() as string
get
return textbox1.text
end get
set(byval value as string)
textbox1.text = value
end set
end property
接下來要做的是:
a. 切換到 form1 的代碼,在 “inherits system.windows.forms.form” 后面增加一行:
dim myform2 as new form2()
b. 在 form1 中雙擊button1 按鈕,在它的 click 事件處理程序代碼中輸入下列代碼:
myform2.customername = "fred"
myform2.show()
c. 在 form1 中雙擊button2 按鈕,在它的 click 事件處理程序代碼中輸入下列代碼:
messagebox.show(myform2.customername)
myform2.customername = "joe"
d. 按 f5 運(yùn)行項(xiàng)目,并點(diǎn)擊窗體中的 button1 和 button2 按鈕,以觀察代碼運(yùn)行情況。
表面看來,通過 customername 屬性來訪問 form2 與直接訪問 form2 非常相似。然而,這種間接的窗體訪問方式能夠帶來很多好處,其中最重要的一點(diǎn)就在于它實(shí)現(xiàn)了更高的抽象性。換言之,哪怕你不知道 form2 中控件的任何細(xì)節(jié) (比如:窗體中是否包含 textbox 控件) ,也能與 form2 交換數(shù)據(jù);你所要做的只是讀取或設(shè)置 customername 屬性值而已。有了這種抽象,你就能在修改 form2 的實(shí)現(xiàn)時(shí)不影響項(xiàng)目中的其它代碼,因而大大簡(jiǎn)化了整個(gè)項(xiàng)目代碼的維護(hù)。單從本文的例子來看,這種基于屬性的窗體編程模式似乎并不比常規(guī)方式簡(jiǎn)單。然而,它以屬性的形式隱藏了窗體的全部細(xì)節(jié),故能用簡(jiǎn)潔、一致的代碼來訪問窗體。所以,它在一些相當(dāng)復(fù)雜的用戶界面編程中能夠大顯身手。總而言之,通過屬性值來訪問窗體及其控件的編程模式雖然不太直觀,卻對(duì)程序員很有價(jià)值:它不但比直接訪問窗體的編程模式來得更專業(yè),而且讓整個(gè)項(xiàng)目的代碼清晰易讀。

在項(xiàng)目中我采用的是全局變量的方法,代碼如下:

public class myform

    private shared m_mainform as system.windows.forms.form

    public shared property mainform() as system.windows.forms.form
        get
            return m_mainform
        end get
        set(byval value as system.windows.forms.form)
            m_mainform = value
        end set
    end property
    end class

注冊(cè)會(huì)員,創(chuàng)建你的web開發(fā)資料庫,
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 理塘县| 乳山市| 满洲里市| 广州市| 肥城市| 黑河市| 兴宁市| 保靖县| 龙川县| 新化县| 海林市| 丹江口市| 合作市| 山东省| 叙永县| 左云县| 虞城县| 晋中市| 探索| 贺兰县| 台湾省| 高要市| 津南区| 芦山县| 灌南县| 乡城县| 融水| 天门市| 峨眉山市| 景宁| 朝阳市| 都昌县| 阳东县| 驻马店市| 宜春市| 磴口县| 封开县| 新源县| 北海市| 石棉县| 海原县|