窗体间传值练习
最近在论坛上看到不少关于两个窗体之间传值的问题。也看过一篇博客上关于两个窗体传值的最佳方案。自己做了一个类似记事本搜索功能,大概使用了两种较为常用的窗体间传值方法。一是将类及其中的控件设置成public,在另已窗体中使用控件的属性。二是通过代理,出发事件,让另一窗体接受数据。
效果图如下:
下面介绍文本搜索工具。新建两个Form,分别命名为MyText和searchForm,当然修饰符用public。MyText窗体中一个TextBox,将TextBox设置为public static型,Multiline为true,一个按钮。searchForm需要一个按钮,一个TextBox,一个按钮。下面开始贴代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace SearchText
{
public partial class MyText : Form
{
public MyText()
{
InitializeComponent();
}
public searchForm seach;//申明变量
bool closed = true;//closed判断是否已存在searchForm的实例
private void btnSearch_Click(object sender, EventArgs e)
{
if (closed)//实例化searchForm
{
closed = false;
seach = new searchForm();
seach.TopMost = true;
//注册事件,在searchFormclosed之后通知MyText已经没有searchForm实例了
seach.FormClosed += new FormClosedEventHandler(seach_FormClosed);
seach.StartPosition = FormStartPosition.Manual;
seach.DesktopLocation = new Point(this.Right - 200, this.Top - 20);
//SearchPhrase为searchForm类中的属性,用于接受MyText中选中要搜索的文本
seach.SearchPhrase = txtDocument.SelectedText;
seach.Show();
}
else//已存在searchForm的实例就激活并赋予焦点
{
seach.SearchPhrase = txtDocument.SelectedText;
seach.Activate();
}
}
void seach_FormClosed(object sender, FormClosedEventArgs e)
{
closed = true;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace SearchText
{
public partial class searchForm : Form
{
public searchForm()
{
InitializeComponent();
}
//用于接受需要搜索的文本
public string SearchPhrase
{
set
{
txtSearch.Text = value;
}
}
private void btnSearch_Click(object sender, EventArgs e)
{
//定位选中文本的开始位置
int textStart=0;
string textDoc = MyText.txtDocument.Text;
string searchText = this.txtSearch.Text;
int ln = searchText.Length;
if (ln > 0)
{
int selectStart = MyText.txtDocument.SelectionStart;
if (selectStart >= MyText.txtDocument.Text.Length)//需搜索的文本超出全部文本长度
{
textStart = 0;
}
else//否则搜索下次出现需要搜索文本的位置
{
textStart = selectStart + ln;
textStart = textDoc.IndexOf(searchText,textStart);
}
if (textStart >= 0)
{
//设置MyText中的选中文本,起始位置
MyText.txtDocument.SelectionStart = textStart;
//设置MyText中选中文本的长度
MyText.txtDocument.SelectionLength = txtSearch.Text.Length;
//让MyText的TextBox获得焦点,否则焦点在searchForm中,文本无法被选中
MyText.txtDocument.Focus();
}
}
}
}
}
总结:通过次文本搜索工具熟悉了窗体间传值的两种方法,当然相信多实践还会有更多中方式。另外特别需要注意的是最后把焦点给MyText的TextBox。本文参考《C#和.Net核心技术》
版权声明:本文为博主原创文章,未经博主允许不得转载。