winform窗体内函数调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform窗体内函数调用相关的知识,希望对你有一定的参考价值。
现在是一个终端的搜索界面窗体。 输入一个关键字,我调用函数发送至服务器端,获得反馈信息后在 类文件里分析反馈信息,并在分析后调用 搜索窗体内的 全局静态函数 。
窗体下的这个全局静态函数要调用窗体内的函数,这些函数要怎样声明才能被互相调用。
窗体内被调用函数:
private void result()
for (int i = 0; i < SearchResult.uiProbeID.Length; i++)
dataGridView1.Rows.Add(SearchResult.uiProbeID[i], SearchResult.uiFileID[i],
SearchResult.sFileName[i], SearchResult.sLastUpdataTime[i]);
全局函数不能调用这个,错误是“非静态的字段、方法或属性"result()"要求对象调用”。 如果把这个函数声明为静态后"datagridview"需要对象调用。 datagridview是窗体内控件,用来显示数据的。
请给予一个解决方案,优秀答案还继续加分。
我的确对这些不够熟悉,所以上面的错了很正常。我希望大家能够告诉我怎样做,而不是为什么错了。
我在搜索界面获取用户输入信息发送到服务器,服务器返回搜索信息,我分析了搜索信息后(分析搜索信息室在单独的一个类文件里实现),分析搜索信息的这个类中 实现对搜索界面中datagridview的添加数据。
我在这个类里要怎么写调用,搜索界面要怎么写函数(告诉我函数调用关系和函数如何声明就可以了,怕麻烦的话不用贴代码)
看来你对静态方法与实例方法不熟
类里面的静态方法不需要实例化类就能使用。
而实例方法必需是实例化对象的方法
datagridview 是窗体内的控件,而窗体是实例化的对象。
private void result()是实例化对象的方法,静态方法绝对不能直接调用.
你这问题的解决方案这里有:
http://www.vjsdn.com/bbs/bbsTopicDetails.aspx?pid=451
有附图
参考技术A //外创建一个符合result()函数的委托://用于执行“Result()”私有方法的委托
public delegate void DoResultMethodDelegate();
//假如这是你的静态方法,参数是那个“执行Result函数”的委托
public static void MyStaticMethod(DoResultMethodDelegate DoResultMethodDele)
//通过委托来实现函数调用
if (DoResultMethodDele!=null)
//这里就相当于调用了你的Result()函数
DoResultMethodDele();
private void Do()
//在这里实例化委托
DoResultMethodDelegate doResult = new DoResultMethodDelegate(this.Result);//这里是你分配给委托的函数
//调用静态方法
MyStaticMethod(doResult);
参考技术B 你的类的设计本来就有问题。分析类去调用窗体的静态函数,窗体的静态函数又要调用窗体的非静态函数...这样的设计不合理
winform窗体间传值
1.通过构造函数
特点:传值是单向的(不可以互相传值),实现简单 实现代码如下: 在窗体Form2中 int value1; string value2; public Form2 ( int value1 , string value2 ) { InitializeComponent ( ); this.value1 = value1; this.value2 = value2; } 在窗体Form1中这样调用 new Form2 ( 111 , "222" ).Show ( ); //这样就把111,"222",这2个值传送给了Form2
2.通过静态变量
3.通过窗体的公有属性值
4.通过窗体的公有属性值和Owner属性
5.通过窗体的公有属性值和Application.OpenForms属性
说明:Application.OpenForms属性:获取属于应用程序的打开窗体的集合。(此属性在 .NET Framework2.0版中) 实现代码如下: 在窗体Form1中 public int Form1Value = 1; Form2 f2 = new Form2 ( ); f2.Show ( ); 在窗体Form2中 string formName = "Form1"; Form fr = Application.OpenForms [ formName ]; if ( fr != null ) { Form1 f1 = ( Form1 ) fr; //取到Form1的值是1 MessageBox.Show ( f1.Form1Value.ToString ( ) ); //给Form1的Form1Value赋值222 f1.Form1Value = 222; }
6.通过事件
实现代码如下: 在窗体Form2中定义公有属性Form2Value,获取和设置textBox1的文本值 并且还定义一个accept事件 public string Form2Value { get { return this.textBox1.Text; } set { this.textBox1.Text = value; } } public event EventHandler accept; private void button1_Click ( object sender , EventArgs e ) { if ( accept != null ) { accept ( this , EventArgs.Empty ); //当窗体触发事件,传递自身引用 } } 在窗体Form1中 Form2 f2 = new Form2 ( ); f2.accept += new EventHandler ( f2_accept ); f2.Show ( ); void f2_accept ( object sender , EventArgs e ) { //事件的接收者通过一个简单的类型转换得到Form2的引用 Form2 f2 = (Form2) sender; //接收到Form2的textBox1.Text this.textBox1.Text = f2.Form2Value; }
7:通过控件赋值
以上是关于winform窗体内函数调用的主要内容,如果未能解决你的问题,请参考以下文章
关于WinForm 中 调用SetParent这个API的问题