2015-11-25 6 views
1
private void RegisterObjectEvents(XElement xelement, XtraForm form) 
    { 
     XElement fEventElement = xelement.Element("ObjectEvents"); 
     if (fEventElement != null) 
     { 
      var fSubElement = fEventElement.Elements(); 
      foreach (var item in fSubElement) 
      { 
       if (!IsformEvent(item.Name.ToString())) 
       { 
        Control control = null; 
        for (int i = 0; i <= fObjectList.Count - 1; i++) 
        { 
         if (fObjectList[i].Name == GetObjectNameFromString(item.Name.ToString())) 
         { 
          control = fObjectList[i]; 
          break; 
         } 
        } 
        if (control != null) 
        { 
         EventInfo ei = control.GetType().GetEvent(GetEventNameFromString(item.Name.ToString()));        
         EventHandler del = (o, args) => ExecuteLua(item.Value, o, args);        
         ei.AddEventHandler(control,del);//getting exception here 
        } 
       } 
      } 
     } 
    } 

    public void ExecuteLua(string luastring,object sender , EventArgs e) 
    { 
     try 
     {    
      Lua.LoadCLRPackage(); 
      Lua["sender"] = (Control)sender; 
      Lua["eventarg"] = e; 
      Lua["viewer"] = this; 
      Lua["form"] = this.WinForm;     
      Lua.DoString(luastring);    
     } 
     catch (Exception exp) 
     { 
      MessageBox.Show(exp.Message.ToString()); 
     } 
    } 

Я пытаюсь читать объекты управления и информацию о событии из XElement и регистрации событий выполнения управления. Но получение«System.EventHandler» до «» DevExpress.XtraEditors.Controls.ChangingEventHandler новообращенного ошибки

'System.EventHandler' to DevExpress.XtraEditors.Controls.ChangingEventHandler 'exception exception.

Как это исправить?

+0

Я не вижу декларацию 'fObjectList' – Phate01

+0

Он уже определен и создан в class.I не послал его, вызвать не так важно .. –

ответ

0

Я нашел такой способ;

 public static Delegate ConvertDelegate(Delegate originalDelegate, Type targetDelegateType) 
    { 
     return Delegate.CreateDelegate(
      targetDelegateType, 
      originalDelegate.Target, 
      originalDelegate.Method) ; 
    } 

и я использую его следующим образом;

private void RegisterObjectEvents(XElement xelement, XtraForm form) 
    {    
     XElement fEventElement = xelement.Element("ObjectEvents"); 
     if (fEventElement != null) 
     { 
      var fSubElement = fEventElement.Elements(); 
      foreach (var item in fSubElement) 
      { 
       if (!IsformEvent(item.Name.ToString())) 
       { 
        Control control = null; 
        for (int i = 0; i <= fObjectList.Count - 1; i++) 
        { 
         if (fObjectList[i].Name == GetObjectNameFromString(item.Name.ToString())) 
         { 
          control = fObjectList[i]; 
          break; 
         } 
        } 
        if (control != null) 
        { 
         EventInfo ei = control.GetType().GetEvent(GetEventNameFromString(item.Name.ToString())); 
         Type tDelegate = ei.EventHandlerType;       
         EventHandler del = (o, args) => ExecuteLua(item.Value,o, args); 
         ei.AddEventHandler(control, ConvertDelegate(del, tDelegate));         
        } 
       } 
      } 
     } 
    }