2013-02-25 29 views
0

我有一个查看剪贴板的简单脚本。一旦它被改变,它会抛出一个事件,查看包含的文本并使用该文本来填充数据网格。我无法访问自定义事件中的数据网格

事件工作正常,按预期方式检索文本,但是当我尝试向数据网格添加一行时,什么都不会发生。任何建议?

public void ClipBoardHasChanged(ClipboardMonitor m, ClipboardChangedEventArgs e) 
    { 
     string clipBoardValue = (string)e.ClipboardChangedEventArgsT.GetData(DataFormats.StringFormat, true); 
     this.dataGridView1.Rows.Add(); 
     this.dataGridView1.Rows[0].Cells[0].Value = clipBoardValue; 
    } 

剪贴板

namespace MarketMatrixCorrelation 
    { 
     [DefaultEvent("ClipboardChanged")] 
     public class ClipboardMonitor : Control 
     { 
      IntPtr nextClipboardViewer; 

      [DllImport("User32.dll")] 
      protected static extern int SetClipboardViewer(int hWndNewViewer); 

      [DllImport("User32.dll", CharSet = CharSet.Auto)] 
      public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext); 

      [DllImport("user32.dll", CharSet = CharSet.Auto)] 
      public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); 

      public ClipboardMonitor() 
      { 
       this.BackColor = System.Drawing.Color.Red; 
       this.Visible = false; 

       nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle); 
      } 

      /// <summary> 
      /// Clipboard contents changed. 
      /// </summary> 
      public delegate void ClipboardChanged(ClipboardMonitor s, ClipboardChangedEventArgs e); 
      public event ClipboardChanged ClipboardChangedT = delegate { }; 


      protected override void Dispose(bool disposing) 
      { 
       ChangeClipboardChain(this.Handle, nextClipboardViewer); 
      } 

      protected override void WndProc(ref System.Windows.Forms.Message m) 
      { 
       // defined in winuser.h 
       const int WM_DRAWCLIPBOARD = 0x308; 
       const int WM_CHANGECBCHAIN = 0x030D; 

       switch (m.Msg) 
       { 
        case WM_DRAWCLIPBOARD: 
         SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); 

         OnClipboardChanged(); 
         break; 

        case WM_CHANGECBCHAIN: 
         if (m.WParam == nextClipboardViewer) 
          nextClipboardViewer = m.LParam; 
         else 
          SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam); 
         break; 

        default: 
         base.WndProc(ref m); 
         break; 
       } 
      } 

      //Catch when something is posted on the clipboard 
      private void OnClipboardChanged() 
      { 
       try 
       { 
        ClipboardChangedEventArgs iData = new ClipboardChangedEventArgs(); 
        iData.ClipboardChangedEventArgsT = Clipboard.GetDataObject(); 

        if (iData.ClipboardChangedEventArgsT.GetDataPresent(DataFormats.StringFormat)) 
        { 
         ClipboardChangedT(this, iData); 
        } 
       } 
       catch (Exception e) 
       { 
        MessageBox.Show(e.ToString()); 
       } 
      } 
     } 

     public class ClipboardChangedEventArgs : EventArgs 
     { 
      private IDataObject DataObject; 

      public IDataObject ClipboardChangedEventArgsT 
      { 
       set 
       { 
        DataObject = value; 
       } 
       get 
       { 
        return this.DataObject; 
       } 
      } 
     } 
} 
+0

是正确的。这只是为了展示我的成就。唯一的问题是没有任何反应! datagridview中没有添加任何内容。 – 2013-02-25 12:15:10

+0

我道歉我删除了我的评论..试试我的回答,你在winform? – spajce 2013-02-25 12:16:52

+0

不用担心。是的,我在winform。我的事件是在一个单独的类,但它似乎正常工作(即,如果我复制到剪贴板像“aaaa”字符串变量clipBoardValue反映相反“aaaa”)。 – 2013-02-25 12:20:05

回答

0

的类只需将您的FormClipBoardMonitor并粘贴此在Form Load Event

+0

嗨spajce,感谢您的建议,但不幸的是它也不起作用。 – 2013-02-25 12:17:03

+0

最新错误? – spajce 2013-02-25 12:17:25

+0

没有错误。它正确处理,但没有出现在数据网格中。 – 2013-02-25 12:21:36

相关问题