程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> winfrom 控制窗體間相互傳遞數據

winfrom 控制窗體間相互傳遞數據

編輯:C#入門知識

方法一
在子窗體中自定義一個構造函數,參數類型是主窗體,當要顯示子窗體的時候,就用這個構造函數來實例化子窗體,然後把this指針傳進去。代碼如下:
主窗體.cs
public class frmMain:Form
{
...
frmControl controlForm=new frmControl(this);
controlForm.Show();
}
復制代碼
子窗體.cs
子窗體.cs
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

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

方法二
其實方法一不是很好,雖然實現起來很簡單,只是想改變窗體的標題文本,就把整個主窗體的引用都傳遞給子窗體,這樣的方式不是很幽雅,我們用接口來改進上面的方法,這樣可以限制暴露給子窗體的功能,降低窗體之間的耦合度。代碼如下:
定義接口.cs
public interface IChangeTitle:
{
void ChangeTitle(string title);
}
復制代碼
主窗體.cs
主窗體.cs
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->public class frmMain:Form,IChangeTitle
{
...
frmControl controlForm=new frmControl(this);
controlForm.Show();
public void ChangeTitle(string title)
{
this.Text=title;
}
}
復制代碼
子窗體.cs
子窗體.cs
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->public class frmControl:Form //子窗體,用來控制主窗體的某些顯示!
{
private IChangeTitle ichangeTitle;
public frmControl(IChangeTitle ichangeTitle)
{
this.ichangeTitle=ichangeTitle;
}
private void button1_Click(object sender,EventArgs e)
{
// 通過接口來調用方法
ichangeTitle.ChangeTitle(this.textBox1.Text);
}
}
復制代碼

方法三
為了進一步降低窗體之間的耦合度,我們可以用委托來實現這個需求。代碼如下:
主窗體.cs
主窗體.cs
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->// 主窗體給委托變量賦值就可以了:
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();
}
}
復制代碼
子窗體.cs
子窗體.cs
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->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"); //委托調用

}
}
復制代碼

方法四
也可以在子窗體中定義一個自定義的事件,然後自定義一個事件參數,用來傳遞你想傳遞的一些信息。代碼如下:
主窗體.cs
主窗體.cs
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->// 主窗體訂閱這個事件就可以了
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();
}
}
復制代碼
子窗體.cs
子窗體.cs
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->public partial class ChildForm : Form
{
public class TitleChangedEventArgs : EventArgs // 事件參數類
{
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);// 觸發事件

}
// 觸發事件的方法
protected virtual void OnTitleChanged(TitleChangedEventArgs e)
{
if (TitleChanged != null)
TitleChanged(this, e);
}
}

摘自 Bychentufeiyang的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved