2013-02-25 67 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

相關問題