反射清除所有事件问题.button可以EventClick找到,NumericUpDown的事件找不到.

autoid1 2013-03-05 05:57:42
Button的Click事件.我用EventClick找到了所有Delegate.
NumericUpDown的ValueChanged事件.我用EventValueChanged找不到Delegate.
怎么办.
用的是以前高手写的方法.
希望各位大神赐教。
 public static Delegate[] GetObjectEventList<T>(T p_Control, string p_EventName)
{
PropertyInfo _PropertyInfo = p_Control.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
if (_PropertyInfo != null)
{
object _EventList = _PropertyInfo.GetValue(p_Control, null);
if (_EventList != null && _EventList is EventHandlerList)
{
EventHandlerList _List = (EventHandlerList)_EventList;
FieldInfo _FieldInfo = (typeof(Control)).GetField(p_EventName, BindingFlags.Static | BindingFlags.NonPublic);
if (_FieldInfo == null) return null;
Delegate _ObjectDelegate = _List[_FieldInfo.GetValue(p_Control)];
if (_ObjectDelegate == null) return null;
return _ObjectDelegate.GetInvocationList();
}
}
return null;
}

或者有其他方法清除所有ValueChanged事件的委托也可以.
...全文
225 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
autoid1 2013-03-07
  • 打赏
  • 举报
回复
未解决.送分.
autoid1 2013-03-06
  • 打赏
  • 举报
回复
引用 15 楼 lye2000000_super 的回复:
帮不了你了。。。。。。。
不管怎样.还是谢谢.
  • 打赏
  • 举报
回复
帮不了你了。。。。。。。
autoid1 2013-03-06
  • 打赏
  • 举报
回复
引用 13 楼 lye2000000_super 的回复:
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; ……
fieldInfo不为空了.但是 Delegate d = eventHandlerList[fieldInfo.GetValue(control)]; 这个变量d为空.还是不能继续下去. 你的代码试了不能清除事件哦.
  • 打赏
  • 举报
回复
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; BindingFlags mPropertyFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase |BindingFlags.Static; BindingFlags mFieldFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Static; Type controlType = control.GetType(); PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags); EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null); String name = "Event" + eventname; FieldInfo fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { name = "Event_" + controlType.Name + eventname; fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { name = name.ToUpper(); fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { fieldInfo = controlType.GetField("onValueChanged", mFieldFlags); } } } Delegate d = eventHandlerList[fieldInfo.GetValue(control)]; if (d == null) return; EventInfo eventInfo = controlType.GetEvent(eventname); foreach (Delegate dx in d.GetInvocationList()) eventInfo.RemoveEventHandler(control, dx); } 你绑定了事件了?我绑定了。也找到了。。。
  • 打赏
  • 举报
回复
用我的那个方法。你把程序复制过去就能找到。 我这已经找到了。
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 10 楼 lye2000000_super 的回复:
fieldInfo = controlType.GetField(“onValueChanged”, mFieldFlags);
onValueChanged OnValueChanged 或者前面加Event也是返回空 fieldInfo .
  • 打赏
  • 举报
回复
fieldInfo = controlType.GetField(“onValueChanged”, mFieldFlags);
  • 打赏
  • 举报
回复
找了下。叫onValueChanged
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 7 楼 lye2000000_super 的回复:
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; ……
还是同样的问题哦.fieldInfo 等于 null. 各种尝试都是这样.
  • 打赏
  • 举报
回复
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; BindingFlags mPropertyFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase |BindingFlags.Static; BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic; Type controlType = control.GetType(); PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags); EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null); String name = "Event" + eventname; FieldInfo fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { name = "Event_" + controlType.Name + eventname; fieldInfo = controlType.GetField(name, mFieldFlags); if (fieldInfo == null) { name = name.ToUpper(); fieldInfo = controlType.GetField(name, mFieldFlags); } } Delegate d = eventHandlerList[fieldInfo.GetValue(control)]; if (d == null) return; EventInfo eventInfo = controlType.GetEvent(eventname); foreach (Delegate dx in d.GetInvocationList()) eventInfo.RemoveEventHandler(control, dx); } 这个有可能好使。
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 2 楼 lye2000000_super 的回复:
那个时间的名字不对。肯定不是叫这个 跟button的不一样。
可以帮忙看看是什么名字吗.或者告诉我从哪里找. 这是winForm自带的控件.
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 4 楼 gxingmin 的回复:
if (_EventList != null && _EventList is EventHandlerList)这句设个断点,看 _EventList 变量
这里没报错. 走到下一行: FieldInfo _FieldInfo = 这里就为空了.
gxingmin 2013-03-05
  • 打赏
  • 举报
回复
if (_EventList != null && _EventList is EventHandlerList)这句设个断点,看 _EventList 变量
autoid1 2013-03-05
  • 打赏
  • 举报
回复
引用 1 楼 gxingmin 的回复:
你跟踪一下ValueChanged事件时什么类型? 可能不是EventHandlerList类型吧,你监控一下看看
怎么监控它是不是EventHandlerList?.
namespace System.Windows.Forms
{
    // 摘要:
    //     表示显示数值的 Windows 数字显示框(也称作 up-down 控件)。
    [ComVisible(true)]
    [DefaultBindingProperty("Value")]
    [SRDescription("DescriptionNumericUpDown")]
    [DefaultProperty("Value")]
    [DefaultEvent("ValueChanged")]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class NumericUpDown : UpDownBase, ISupportInitialize
    {
      //
        // 摘要:
        //     在以某种方式更改 System.Windows.Forms.NumericUpDown.Value 属性后发生。
        [SRCategory("CatAction")]
        [SRDescription("NumericUpDownOnValueChangedDescr")]
        public event EventHandler ValueChanged;
  • 打赏
  • 举报
回复
那个时间的名字不对。肯定不是叫这个 跟button的不一样。
gxingmin 2013-03-05
  • 打赏
  • 举报
回复
你跟踪一下ValueChanged事件时什么类型? 可能不是EventHandlerList类型吧,你监控一下看看
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Net.Sockets; namespace PortCheck { /// /// Form1 的摘要说明。 /// public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Label label2; private System.Windows.Forms.NumericUpDown numericUpDown1; private System.Windows.Forms.Label label3; private System.Windows.Forms.NumericUpDown numericUpDown2; private System.Windows.Forms.Button button1; private System.Windows.Forms.RichTextBox richTextBox1; private System.Windows.Forms.ProgressBar progressBar1; /// /// 必需的设计器变量。 /// private System.ComponentModel.Container components = null; public Form1() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); // // TODO: 在 InitializeComponent 调用后添加任何构造函数代码 // } /// /// 清理所有正在使用的资源。 /// protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows 窗体设计器生成的代码 /// /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); this.label3 = new System.Windows.Forms.Label(); this.numericUpDown2 = new System.Windows.Forms.NumericUpDown(); this.button1 = new System.Windows.Forms.Button(); this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.progressBar1 = new System.Windows.Forms.ProgressBar(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit(); this.SuspendLayout(); // // label1 // this.label1.Location = new System.Drawing.Point(8, 16); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(80, 16); this.label1.TabIndex = 0; this.label1.Text = "目标主机名:"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(88, 8); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(72, 21); this.textBox1.TabIndex = 1; this.textBox1.Text = "127.0.0.1"; // // label2 // this.label2.Location = new System.Drawing.Point(168, 16); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(80, 16); this.label2.TabIndex = 2; this.label2.Text = "起始端口号:"; // // numericUpDown1 // this.numericUpDown1.Location = new System.Drawing.Point(248, 8); this.numericUpDown1.Maximum = new System.Decimal(new int[] { 65536, 0, 0, 0}); this.numericUpDown1.Name = "numericUpDown1"; this.numericUpDown1.Size = new System.Drawing.Size(80, 21); this.numericUpDown1.TabIndex = 3; // // label3 // this.label3.Location = new System.Drawing.Point(8, 40); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(80, 16); this.label3.TabIndex = 4; this.label3.Text = "结束端口号:"; // // numericUpDown2 // this.numericUpDown2.Location = new System.Drawing.Point(88, 32); this.numericUpDown2.Maximum = new System.Decimal(new int[] { 65536, 0, 0, 0}); this.numericUpDown2.Name = "numericUpDown2"; this.numericUpDown2.Size = new System.Drawing.Size(72, 21); this.numericUpDown2.TabIndex = 5; this.numericUpDown2.Value = new System.Decimal(new int[] { 50, 0, 0, 0}); // // button1 // this.button1.Location = new System.Drawing.Point(248, 32); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(80, 23); this.button1.TabIndex = 6; this.button1.Text = "开始扫描"; this.button1.Click += new System.EventHandler(this.button1_Click); // // richTextBox1 // this.richTextBox1.Location = new System.Drawing.Point(8, 56); this.richTextBox1.Name = "richTextBox1"; this.richTextBox1.Size = new System.Drawing.Size(320, 168); this.richTextBox1.TabIndex = 7; this.richTextBox1.Text = ""; // // progressBar1 // this.progressBar1.Location = new System.Drawing.Point(8, 224); this.progressBar1.Name = "progressBar1"; this.progressBar1.Size = new System.Drawing.Size(320, 23); this.progressBar1.Step = 1; this.progressBar1.TabIndex = 10; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(336, 254); this.Controls.Add(this.progressBar1); this.Controls.Add(this.richTextBox1); this.Controls.Add(this.button1); this.Controls.Add(this.numericUpDown2); this.Controls.Add(this.label3); this.Controls.Add(this.numericUpDown1); this.Controls.Add(this.label2); this.Controls.Add(this.textBox1); this.Controls.Add(this.label1); this.MaximizeBox = false; this.Name = "Form1"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "演示端口扫描"; ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit(); this.ResumeLayout(false); } #endregion /// /// 应用程序的主入口点。 /// [STAThread] static void Main() { Application.Run(new Form1()); } private void button1_Click(object sender, System.EventArgs e) {//扫描端口 int iStart=(int)this.numericUpDown1.Value; int iEnd=(int)this.numericUpDown2.Value; try { this.progressBar1.Minimum=iStart; this.progressBar1.Maximum=iEnd; this.richTextBox1.Text="程序开始扫描端口:\\n"; this.richTextBox1.Update(); for(int i=iStart ;iButtons.OK,MessageBoxIcon.Information); } } } }

111,097

社区成员

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

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

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