• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
    當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

    WinForm中窗體間的數(shù)據(jù)傳遞交互的一些方法

    來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:42:14
    文檔

    WinForm中窗體間的數(shù)據(jù)傳遞交互的一些方法

    WinForm中窗體間的數(shù)據(jù)傳遞交互的一些方法:實(shí)際上過(guò)去我也寫(xiě)過(guò)類似的主題,這里把各種方法總結(jié)一下,內(nèi)容的確基礎(chǔ)了一些,所以這篇文章是寫(xiě)給剛剛學(xué)習(xí)C#的同行們的,希望對(duì)大家有些幫助吧!很抱歉,這篇文章沒(méi)有詭異的bug來(lái)勾起大家的興趣,但是下篇文章我會(huì)努力寫(xiě)些有趣的主題的! 在窗體間傳遞數(shù)據(jù)的
    推薦度:
    導(dǎo)讀WinForm中窗體間的數(shù)據(jù)傳遞交互的一些方法:實(shí)際上過(guò)去我也寫(xiě)過(guò)類似的主題,這里把各種方法總結(jié)一下,內(nèi)容的確基礎(chǔ)了一些,所以這篇文章是寫(xiě)給剛剛學(xué)習(xí)C#的同行們的,希望對(duì)大家有些幫助吧!很抱歉,這篇文章沒(méi)有詭異的bug來(lái)勾起大家的興趣,但是下篇文章我會(huì)努力寫(xiě)些有趣的主題的! 在窗體間傳遞數(shù)據(jù)的

    實(shí)際上過(guò)去我也寫(xiě)過(guò)類似的主題,這里把各種方法總結(jié)一下,內(nèi)容的確基礎(chǔ)了一些,所以這篇文章是寫(xiě)給剛剛學(xué)習(xí)C#的同行們的,希望對(duì)大家有些幫助吧!很抱歉,這篇文章沒(méi)有詭異的bug來(lái)勾起大家的興趣,但是下篇文章我會(huì)努力寫(xiě)些有趣的主題的!

    在窗體間傳遞數(shù)據(jù)的方法比較多:
    1,在子窗體中自定義一個(gè)構(gòu)造函數(shù),參數(shù)類型是主窗體,當(dāng)要顯示子窗體的時(shí)候,就用這個(gè)構(gòu)造函數(shù)來(lái)實(shí)例化子窗體,然后把this指針傳進(jìn)去,說(shuō)起來(lái)太抽象了,我大概一寫(xiě)大家應(yīng)該就明白了:
    代碼如下:


    public class frmMain:Form
    {
    ...
    frmControl controlForm=new frmControl(this);
    controlForm.Show();
    }
    public class frmControl:Form //子窗體,用來(lái)控制主窗體的某些顯示!
    {
    private frmMain mainForm;
    public frmControl(frmMain mainForm)
    {
    this.mainForm=mainForm;
    }
    private void button1_Click(object sender,EventArgs e)
    {
    frmMain.textBox1.Text=this.textBox1.Text; //把子窗體的文本框值傳遞給主窗體的文本框!
    }
    }

    2,我個(gè)人感覺(jué)上面的方法不是很好,雖然實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,只是想改變窗體的標(biāo)題文本,就把整個(gè)主窗體的引用都傳遞給子窗體,這樣的方式不是很幽雅,我們用接口來(lái)改進(jìn)上面的方法,這樣可以限制暴露給子窗體的功能,降低窗體之間的耦合度:
    代碼如下:

    public interface IChangeTitle:
    {
    void ChangeTitle(string title);
    }
    public class frmMain:Form,IChangeTitle
    {
    ...
    frmControl controlForm=new frmControl(this);
    controlForm.Show();
    public void ChangeTitle(string title)
    {
    this.Text=title;
    }
    }
    public class frmControl:Form //子窗體,用來(lái)控制主窗體的某些顯示!
    {
    private IChangeTitle ichangeTitle;
    public frmControl(IChangeTitle ichangeTitle)
    {
    this.ichangeTitle=ichangeTitle;
    }
    private void button1_Click(object sender,EventArgs e)
    {
    ichangeTitle.ChangeTitle(this.textBox1.Text); //通過(guò)接口來(lái)調(diào)用方法
    }
    }

    3,為了進(jìn)一步降低窗體之間的耦合度,我們可以用委托來(lái)實(shí)現(xiàn)這個(gè)需求:
    代碼如下:

    public partial class ChildForm : Form
    {
    public delegate void TitleChangedHandler(string title);
    public TitleChangedEventHandler TitleChanged;
    public ChildForm()
    {
    InitializeComponent();
    }
    private void btn_Ok_Click(object sender, EventArgs e)
    {
    if (TitleChanged != null)
    TitleChanged("Test Title"); //委托調(diào)用
    }
    }

    主窗體給委托變量賦值就可以了:
    代碼如下:

    public partial class MainForm : Form
    {
    private ChildForm loginForm = new ChildForm();
    public MainForm()
    {
    InitializeComponent();
    loginForm.TitleChanged = new ChildForm.TitleChangedEventHandler(FormTitleChanged);
    }
    protected void FormTitleChanged(string title)
    {
    this.Text = title;
    }
    private void button1_Click(object sender, EventArgs e)
    {
    loginForm.Show();
    }
    }

    4,也可以在子窗體中定義一個(gè)自定義的事件,然后自定義一個(gè)事件參數(shù),用來(lái)傳遞你想傳遞的一些信息:
    代碼如下:

    public partial class ChildForm : Form
    {
    public class TitleChangedEventArgs : EventArgs //事件參數(shù)類
    {
    private string title = "";
    public string Title
    {
    get
    {
    return title;
    }
    set
    {
    title = value;
    }
    }
    }
    public delegate void TitleChangedEventHandler(object sender, TitleChangedEventArgs e);
    public event TitleChangedEventHandler TitleChanged;
    public ChildForm()
    {
    InitializeComponent();
    }
    private void btn_Ok_Click(object sender, EventArgs e)
    {
    TitleChangedEventArgs e1=new TitleChangedEventArgs();
    e1.Title="Login sucessed";
    OnTitleChanged(e1);//觸發(fā)事件
    }
    protected virtual void OnTitleChanged(TitleChangedEventArgs e) //觸發(fā)事件的方法
    {
    if (TitleChanged != null)
    TitleChanged(this, e);
    }
    }

    主窗體訂閱這個(gè)事件就可以了:
    代碼如下:

    public partial class MainForm : Form
    {
    private ChildForm loginForm = new ChildForm();
    public MainForm()
    {
    InitializeComponent();
    loginForm.TitleChanged += new ChildForm.TitleChangedEventHandler(FormTitleChanged);
    }
    protected void FormTitleChanged(object sender, ChildForm.TitleChangedEventArgs e)
    {
    this.Text = e.Title;
    }
    private void button1_Click(object sender, EventArgs e)
    {
    loginForm.Show();
    }
    }

    通過(guò)子窗口向外引發(fā)一個(gè)事件,父窗口去實(shí)現(xiàn)該事件,我們可以再不關(guān)閉父窗口和子窗口的情況下進(jìn)行數(shù)據(jù)的傳輸顯示

    思路:在子窗口“添加用戶”的中通過(guò)點(diǎn)擊"添加用戶",會(huì)動(dòng)態(tài)的向外引發(fā)一個(gè)事件,通過(guò)該事件,我們可以進(jìn)行數(shù)據(jù)傳遞

    在其他窗口中,可以來(lái)響應(yīng)該事件

    其中,子窗口只負(fù)責(zé)向外引發(fā)一個(gè)事件,將事件的實(shí)現(xiàn)方法委托給別的對(duì)象,至于事件具體如何做處理,子窗口是不關(guān)心的,這一點(diǎn)體現(xiàn)了松耦合的一個(gè)設(shè)置

    涉及到的知識(shí)點(diǎn):
    如何定義一個(gè)事件?
    代碼如下:
    public delegate void UserAddEventHandler();
    public event UserAddEventHandler UserAdd;
    .如何響應(yīng)子窗口引發(fā)出來(lái)的事件?

    userDialog.UserAdd += userDialog_UserAdd;//將UserAdd的實(shí)現(xiàn)委托為userDialog_UserAdd方法

    void userDialog_UserAdd()
    {
      //方法體
    }
    .子窗口中如何向父窗口傳遞數(shù)據(jù)?

    通過(guò)delegate的聲明中,添加兩個(gè)參數(shù):

    public delegate void UserAddEventHandler(object sender,UserEventArgs e);

    其中UserEventArgs是一個(gè)繼承自EventArgs的類

    public class UserEventArgs : EventArgs
    {
    public User currentUser { get;set;}
    public UserEventArgs(User user)
    {
    this.currentUser = user;
    }
    }
    從而,在向外引發(fā)事件的時(shí)候,將User的信息通過(guò)第二個(gè)參數(shù)傳遞出去

    private void button1_Click(object sender, EventArgs e)
    {
    //向外引發(fā)一個(gè)事件
    if(UserAdd!=null)
    {
    User user = new User();
    user.UserName = textBox3.Text;
    user.PassWord = textBox4.Text;
    UserAdd(this,new UserEventArgs(user));
    }
    }
    在父窗口的userDialog_UserAdd方法中,就可以對(duì)接收到的數(shù)據(jù)進(jìn)行處理
    private void 添加用戶ToolStripMenuItem_Click(object sender, EventArgs e)
    {
      FrmUser userDialog = new FrmUser();
      //將UserAdd的實(shí)現(xiàn)委托為userDialog_UserAdd方法
      userDialog.UserAdd += userDialog_UserAdd;

      userDialog.ShowDialog();
    }

    void userDialog_UserAdd(object sender,UserEventArgs e)
    {
      MessageBox.Show(e.currentUser.UserName);
    }

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    WinForm中窗體間的數(shù)據(jù)傳遞交互的一些方法

    WinForm中窗體間的數(shù)據(jù)傳遞交互的一些方法:實(shí)際上過(guò)去我也寫(xiě)過(guò)類似的主題,這里把各種方法總結(jié)一下,內(nèi)容的確基礎(chǔ)了一些,所以這篇文章是寫(xiě)給剛剛學(xué)習(xí)C#的同行們的,希望對(duì)大家有些幫助吧!很抱歉,這篇文章沒(méi)有詭異的bug來(lái)勾起大家的興趣,但是下篇文章我會(huì)努力寫(xiě)些有趣的主題的! 在窗體間傳遞數(shù)據(jù)的
    推薦度:
    • 熱門(mén)焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門(mén)推薦

    專題
    Top
    主站蜘蛛池模板: 亚洲欧洲美洲无码精品VA| 小辣椒福利视频精品导航| 亚洲国产成人精品久久久国产成人一区二区三区综 | 久久久久久亚洲精品不卡| 国产精品成人观看视频国产奇米 | 久久精品国产99久久丝袜| 国产精品一国产精品| 亚洲精品无码午夜福利中文字幕| 99九九精品免费视频观看| 国语自产精品视频在线区| 欧美成人精品欧美一级乱黄码| 99熟女精品视频一区二区三区 | 国产成人精品一区二区三区免费| 亚洲精品天堂成人片?V在线播放| 国产精品视频九九九| 精品亚洲欧美高清不卡高清| 国产精品99精品无码视亚| 日韩精品无码久久久久久| 日韩精品无码久久一区二区三| 国产精品白丝AV嫩草影院| 华人在线精品免费观看| 国产亚洲精品资源在线26u| 亚洲AV永久无码精品一百度影院| 欧美久久亚洲精品| 久久久久99精品成人片三人毛片| 国产精品成人啪精品视频免费| 亚洲国产精品不卡在线电影| 国产精品宾馆在线精品酒店 | 亚洲日韩精品射精日| 欧美成人精品第一区二区三区 | 老子影院午夜精品无码| 精品无人区无码乱码毛片国产 | 精品国产AⅤ一区二区三区4区| 国产精品亚洲综合一区| 国产精品免费久久久久久久久 | 日韩人妻精品无码一区二区三区| 自拍偷自拍亚洲精品情侣| 中文字幕九七精品乱码| 日韩精品真人荷官无码| 精品三级AV无码一区| 久久九九精品99国产精品|