委托只能指向事件吗?

pz25925 2013-08-28 03:53:42
需求很简单,运行窗口1,直接弹出窗口2,并改变窗口2的某个label的text
疑问有2, 请看代码注释。
直接上代码:

//窗口2声明委托
public delegate void Change(string str);
public partial class Form2 : Form
{
//定义一个指向委托的事件,只能通过事件触发吗?
public event Change change;
public Form3()
{
InitializeComponent();
//该处会报错 “並未將物件參考設定為物件的執行個體 ”
change("123");
}
}


//窗口1执行窗口2的委托
public partial class Form3 : Form
{
public Form2()
{
InitializeComponent();

Form3 f = new Form3();
f.change += new Change(f_ChangeColor);
f.Show();
}

void f_ChangeColor(string str)
{
this.Text = str; //this 如何指向我需求的那个label
}
}

...全文
190 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
pz25925 2013-08-28
  • 打赏
  • 举报
回复
谢谢各位,都讲的很好,已经想清楚了。 跨窗体调用委托,需要通过事件访问。 如,窗体2定义委托和指向委托的事件:

public delegate void changeLable(string str);
public event changeLable change;
窗体1执行 窗体2定义的 change

form2.change += new changeLable(form2_change);
至于之后,无论你是需要通过 event 还是 function 都可以执行后续的操作

change += new changeLable(doSomthing);
//or
private void button1_Click(object sender, EventArgs e)
{
     doSomething();
}
pz25925 2013-08-28
  • 打赏
  • 举报
回复
实际效果已达到, 可是还有一个疑问。
public event changeLable change;
这句话一定要写吗? 不写的话无法在其他窗体调用:
form2.change +=new changeLable(change);
pz25925 2013-08-28
  • 打赏
  • 举报
回复
谢谢各位的回复,答疑。 更改后的代码如下:

public Form1()
        {
            InitializeComponent();

            Form2 form2 = new Form2();
            
            form2.change +=new changeLable(change);
            change("窗体1调用窗体2的委托");
            form2.Show();
        }

        private void change(string str)
        {
            this.Text = str;
        }


public delegate void changeLable(string str);
    public partial class Form2 : Form
    {
        public event changeLable change;
        public Form2()
        {
            InitializeComponent();
            change += new changeLable(Form2_change);
        }

        void Form2_change(string str)
        {
            this.label1.Text = str;
        }
    }
异常异长 2013-08-28
  • 打赏
  • 举报
回复
引用 13 楼 pz25925 的回复:
[quote=引用 11 楼 starfd 的回复:]
//窗口2声明委托
public delegate void Change(string str);
    public partial class Form2 : Form
    {
        //定义一个指向委托的事件,只能通过事件触发吗?
        public Form3()
        {
            InitializeComponent();
            //该处会报错 “並未將物件參考設定為物件的執行個體 ”
            Change change = new Change(DoSomeThing);
            change("123");
        }
    }

private void DoSomeThing(string str)
{
}
你这样用委托就对了,简单的说就是你要实例化委托,如果你不用event的话
哦, 了解了, 我思想太僵化了。 不知这样理解是否正确:

//如果
public delegate void Change(string str);
public event Change change; 
//调用change 需要有个事件的实例

//如果
public delegate void Change(string str);
//调用change 需要有方法的实例
Change change = new Change(DoSomeThing);
[/quote]事件在外部只能注册或者取消 ,调用只能是事件类自己调用。
  • 打赏
  • 举报
回复
引用 13 楼 pz25925 的回复:
[quote=引用 11 楼 starfd 的回复:]
//窗口2声明委托
public delegate void Change(string str);
    public partial class Form2 : Form
    {
        //定义一个指向委托的事件,只能通过事件触发吗?
        public Form3()
        {
            InitializeComponent();
            //该处会报错 “並未將物件參考設定為物件的執行個體 ”
            Change change = new Change(DoSomeThing);
            change("123");
        }
    }

private void DoSomeThing(string str)
{
}
你这样用委托就对了,简单的说就是你要实例化委托,如果你不用event的话
哦, 了解了, 我思想太僵化了。 不知这样理解是否正确:

//如果
public delegate void Change(string str);
public event Change change; 
//调用change 需要有个事件的实例

//如果
public delegate void Change(string str);
//调用change 需要有方法的实例
Change change = new Change(DoSomeThing);
[/quote] 是的,其实两者都是在做同一件事情,都是指向一个匹配的可执行方法
异常异长 2013-08-28
  • 打赏
  • 举报
回复
引用 12 楼 pz25925 的回复:
[quote=引用 8 楼 stubble 的回复:] 返回类型,参数类型个数一样的方法 ,都可以委托。 [/code]
谢谢您的回复, 这个是在同一个类中调用, 如果在另外一个类中应该如何调用呢? 单独只定义
delegate double MathAction(double num);
并不能在其他类访问到 MathAction[/quote]声明public 是可以的。
pz25925 2013-08-28
  • 打赏
  • 举报
回复
引用 11 楼 starfd 的回复:
//窗口2声明委托
public delegate void Change(string str);
    public partial class Form2 : Form
    {
        //定义一个指向委托的事件,只能通过事件触发吗?
        public Form3()
        {
            InitializeComponent();
            //该处会报错 “並未將物件參考設定為物件的執行個體 ”
            Change change = new Change(DoSomeThing);
            change("123");
        }
    }

private void DoSomeThing(string str)
{
}
你这样用委托就对了,简单的说就是你要实例化委托,如果你不用event的话
哦, 了解了, 我思想太僵化了。 不知这样理解是否正确:

//如果
public delegate void Change(string str);
public event Change change; 
//调用change 需要有个事件的实例

//如果
public delegate void Change(string str);
//调用change 需要有方法的实例
Change change = new Change(DoSomeThing);
pz25925 2013-08-28
  • 打赏
  • 举报
回复
引用 8 楼 stubble 的回复:
返回类型,参数类型个数一样的方法 ,都可以委托。 [/code]
谢谢您的回复, 这个是在同一个类中调用, 如果在另外一个类中应该如何调用呢? 单独只定义
delegate double MathAction(double num);
并不能在其他类访问到 MathAction
  • 打赏
  • 举报
回复
//窗口2声明委托
public delegate void Change(string str);
    public partial class Form2 : Form
    {
        //定义一个指向委托的事件,只能通过事件触发吗?
        public Form3()
        {
            InitializeComponent();
            //该处会报错 “並未將物件參考設定為物件的執行個體 ”
            Change change = new Change(DoSomeThing);
            change("123");
        }
    }

private void DoSomeThing(string str)
{
}
你这样用委托就对了,简单的说就是你要实例化委托,如果你不用event的话
pz25925 2013-08-28
  • 打赏
  • 举报
回复
好像没有 委托指向方法 这样的概念, 求科普。 假设在一个即时聊天程序中, userA 发信息 userB userB 弹出信息提示。 思路如下: 1, 主聊天窗口定义图标闪烁的委托 2, A sendMessage() 3, 发完信息,调用主窗口的消息闪烁的委托(难道这个委托必须在事件中吗?)。
  • 打赏
  • 举报
回复
MS提供event关键字,主要就是进一步将委托封装,方便控制委托链 +=是将一个方法注册到事件的委托链上 -=则是移除 对于一个event这两个操作符都只能在类里面使用
异常异长 2013-08-28
  • 打赏
  • 举报
回复
返回类型,参数类型个数一样的方法 ,都可以委托。
delegate double MathAction(double num);

class DelegateTest
{
    static double Double(double input)
    {
        return input * 2;
    }

    static void Main()
    {
        MathAction ma = Double;

        double multByTwo = ma(4.5);
        Console.WriteLine("multByTwo: {0}", multByTwo);

        MathAction ma2 = delegate(double input)
        {
            return input * input;
        };

        double square = ma2(5);
        Console.WriteLine("square: {0}", square);

        MathAction ma3 = s => s * s * s;
        double cube = ma3(4.375);

        Console.WriteLine("cube: {0}", cube);
    }

}
pz25925 2013-08-28
  • 打赏
  • 举报
回复
引用 1 楼 u011411110 的回复:
方法也是可以的呀
如何指向方法呢?

public event Change change;   //这里定义指向 event
pz25925 2013-08-28
  • 打赏
  • 举报
回复
引用 2 楼 hdt 的回复:
chang是个类型,你不能直接用这个类型 而要他的实例
change 指向的是一个事件, 如定义
public event Change change;
难道一定要在事件中才能完成吗?如:
private void button1_Click(object sender, EventArgs e)
{
     change("123");//执行委托实例
}
pz25925 2013-08-28
  • 打赏
  • 举报
回复
soory ,代码贴错。

//窗口2声明委托
    public delegate void Change(string str);
    public partial class Form2 : Form
    {
        public event Change change;
        public Form2()
        {
            InitializeComponent();
            change("123");//执行委托实例
        }
    }

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Form2 f = new Form2();
            f.change += new Change(f_ChangeColor);
            f.Show();
        }

        void f_ChangeColor(string str)
        {
            this.Text = str;
        }
    }
youzelin 2013-08-28
  • 打赏
  • 举报
回复
你这代码…………你确定跑过吗?Form2 里面是 Form3 构造函数,Form3 里面是 Form2 构造函数。。。
真相重于对错 2013-08-28
  • 打赏
  • 举报
回复
你没有把这个实例具化
真相重于对错 2013-08-28
  • 打赏
  • 举报
回复
chang是个类型,你不能直接用这个类型 而要他的实例
u011411110 2013-08-28
  • 打赏
  • 举报
回复
方法也是可以的呀

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧