Visual C#从事件处理程序返回值

编程入门 行业动态 更新时间:2024-10-27 22:23:53
本文介绍了Visual C#从事件处理程序返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

表单上的代码:

public delegate void CustomPreviewCreate(); public static event CustomPreviewCreate CustomPreviewCreate_Do; private void CreatePreview() { if(CustomPreviewCreate_Do!= null) { CustomPreviewCreate_Do(); } }

此事件在另一个类中被处理。我想要实现的是,如果方法正确执行,我可以反馈到表单的某种形式的返回值。

我到目前为止没有找到我结果

这是代码:

public void Initialize () { SubAsstViewPartControl.CustomPreviewCreate_Do + = SubAsstViewPartControl_CustomPreviewCreate_Do; //这给我一个编译器错误,返回类型是错误的} 私有bool SubAsstViewPartControl_CustomPreviewCreate_Do() { //做东西返回false; }

有没有直接的方式从事件处理程序返回值,或者我需要使用单独的静态字段来存储事件结果?

更新:

Per @ Jon的评论,对我来说似乎是最简单的,我修改了如下代码:

public delegate bool CustomPreviewCreate() ; public static event CustomPreviewCreate CustomPreviewCreate_Do; private void CreatePreview() { if(CustomPreviewCreate_Do!= null) { bool returnval = CustomPreviewCreate_Do(); } }

然后:

bool SubAsstViewPartControl_CustomPreviewCreate_Do() { // do stuff return true; }

如果这个可以接受的方法,当我想要返回布尔? / p>

解决方案

常见的方法是将您的值封装在 EventArgs 你的活动期待。例如,框架的 CancelEventArgs 包含可设置的 bool取消属性,允许每个 CancelEventHandler 分配一个值。发件人可以在调用事件后读取该属性。如果要从各个事件处理程序中收集单独的值,也可以使用类似容器的 EventArgs 类。例如:

using System; 使用System.Collections.Generic; 命名空间ConsoleApplication1 { public class SingleValueEventArgs:EventArgs { public int Value {get;组; } } public class MultiValueEventArgs:EventArgs { private List< int> _values = new List< int>(); //私人防止处理程序混淆对方的价值 public IEnumerable< int>值 { get {return _values; } } public void AddValue(int value){_values.Add(value); } } public class Exposer { public event EventHandler< SingleValueEventArgs> WantSingleValue; public event EventHandler< MultiValueEventArgs> WantMultipleValues; public void Run() { if(WantSingleValue!= null) { var args = new SingleValueEventArgs(); WantSingleValue(this,args); Console.WriteLine(Last handler generated+ args.Value.ToString()); } if(WantMultipleValues!= null) { var args = new MultiValueEventArgs(); WantMultipleValues(this,args); foreach(argsValues中的var值) { Console.WriteLine(处理程序生成+ value.ToString()); } } } } public class Handler { private int _value; public Handler(Exposer曝光器,int值) { _value = value; exposureer.WantSingleValue + = exposeer_WantSingleValue; exposureer.WantMultipleValues + = exposeer_WantMultipleValues; } void exposeder_WantSingleValue(object sender,SingleValueEventArgs e) { Console.WriteLine(Handler assign+ _value.ToString()); e.Value = _value; } void exposureer_WantMultipleValues(object sender,MultiValueEventArgs e) { Console.WriteLine(Handler added+ _value.ToString()); e.AddValue(_value); } } 类程序 { static void Main(string [] args) { var exposeder =新的Exposer(); (var i = 0; i< 5; i ++) { new Handler(曝光者,i); } exposureer.Run(); } } }

I have a form that has a button to get a method executed in another class.

Code on the form:

public delegate void CustomPreviewCreate(); public static event CustomPreviewCreate CustomPreviewCreate_Do; private void CreatePreview() { if (CustomPreviewCreate_Do !=null) { CustomPreviewCreate_Do(); } }

This event then gets handled in another class. What I would like to achieve is that I can feed back to the form some form of return value if the method correctly executed.

What I tried so far does not get me the result.

Here is the code:

public void Initialize() { SubAsstViewPartControl.CustomPreviewCreate_Do += SubAsstViewPartControl_CustomPreviewCreate_Do; // this gives me a the compiler error that the return type is wrong } private bool SubAsstViewPartControl_CustomPreviewCreate_Do() { // do stuff return false; }

Is there any direct way to return value from an event handler or I need to use a separate static field to store the event result in?

Update:

Per @Jon's comment, which seemed the simplest to me, I modified the code as follows:

public delegate bool CustomPreviewCreate(); public static event CustomPreviewCreate CustomPreviewCreate_Do; private void CreatePreview() { if (CustomPreviewCreate_Do !=null) { bool returnval = CustomPreviewCreate_Do(); } }

And then:

bool SubAsstViewPartControl_CustomPreviewCreate_Do() { // do stuff return true; }

Advice please if this an acceptable approach when I want to just return booleans?

解决方案

The common approach is to encapsulate your value in the type of EventArgs your event expects. For example, the Framework's CancelEventArgs contains a settable bool Cancel property, allowing each CancelEventHandler to assign a value. The sender can then read the property after the event has been invoked. You could also use a container-like EventArgs class if you want to collect separate values from individual event handlers. For example:

using System; using System.Collections.Generic; namespace ConsoleApplication1 { public class SingleValueEventArgs : EventArgs { public int Value { get; set; } } public class MultiValueEventArgs : EventArgs { private List<int> _values = new List<int>(); // Private to prevent handlers from messing with each others' values public IEnumerable<int> Values { get { return _values; } } public void AddValue(int value) { _values.Add(value); } } public class Exposer { public event EventHandler<SingleValueEventArgs> WantSingleValue; public event EventHandler<MultiValueEventArgs> WantMultipleValues; public void Run() { if (WantSingleValue != null) { var args = new SingleValueEventArgs(); WantSingleValue(this, args); Console.WriteLine("Last handler produced " + args.Value.ToString()); } if (WantMultipleValues != null) { var args = new MultiValueEventArgs(); WantMultipleValues(this, args); foreach (var value in args.Values) { Console.WriteLine("A handler produced " + value.ToString()); } } } } public class Handler { private int _value; public Handler(Exposer exposer, int value) { _value = value; exposer.WantSingleValue += exposer_WantSingleValue; exposer.WantMultipleValues += exposer_WantMultipleValues; } void exposer_WantSingleValue(object sender, SingleValueEventArgs e) { Console.WriteLine("Handler assigning " + _value.ToString()); e.Value = _value; } void exposer_WantMultipleValues(object sender, MultiValueEventArgs e) { Console.WriteLine("Handler adding " + _value.ToString()); e.AddValue(_value); } } class Program { static void Main(string[] args) { var exposer = new Exposer(); for (var i = 0; i < 5; i++) { new Handler(exposer, i); } exposer.Run(); } } }

更多推荐

Visual C#从事件处理程序返回值

本文发布于:2023-11-11 13:40:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1578601.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:返回值   事件   程序   Visual

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!