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.通过静态变量

技术分享 View Code

3.通过窗体的公有属性值

技术分享 View Code

4.通过窗体的公有属性值和Owner属性

技术分享 View Code

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:通过控件赋值

技术分享 View Code

以上是关于winform窗体内函数调用的主要内容,如果未能解决你的问题,请参考以下文章

关于WinForm 中 调用SetParent这个API的问题

C# 调用函数后窗体假死失去响应

C# winform怎么实现子窗体关闭时刷新父窗体数据

(C#)怎样在一个窗口中调用另一个窗口中的dataGridView

C# 委托调用另一个窗体的函数

c#如何调用MidMid()