2014-10-03 100 views
1

我創建了一個FaceDetectionEvent,它是一個用戶控件,並嘗試以窗體形式添加它(仍在同一個項目中)。但是,不斷出現這樣的錯誤: enter image description here將用戶控件添加到Windows窗體c時出錯#

這是FaceDetectionEvent代碼:

public partial class FaceDetectionEvent : UserControl 
    { 
     private System.Timers.Timer tListener; 
     private MySQL_DataAccess da = new MySQL_DataAccess(); 
     private int iCurrentStatusIndex_ = 0; 
     private List<DataRow> lstFaceDetectionEvent = new List<DataRow>(20); 
     private ImageList cropImageList = new ImageList(); 


     public FaceDetectionEvent() 
     { 
      InitializeComponent(); 
      CreateColumns(); 
      GetLastTwentyEvent(); 

      tListener = new System.Timers.Timer(1000); 
      tListener.Elapsed += new System.Timers.ElapsedEventHandler(tListener_Elapsed); 
      tListener.Start(); 
     } 

     public void GetLastTwentyEvent() 
     { 
      string strSQL = string.Format("SELECT * FROM av_status_log AS A LEFT JOIN avmediaserver AS B ON A.device_id=B.DeviceId " 
             + "LEFT JOIN privilege_device AS C ON A.device_id = C.device_id " 
             + "LEFT JOIN privilege_device_group AS D ON C.device_group_id = D.device_group_id " 
             + "WHERE event_type_id = 8 ORDER BY A.db_time DESC LIMIT 20"); 
      DataTable dt = da.GetInfoData(strSQL).Tables[0]; 
      if (dt.Rows.Count > 0) 
       iCurrentStatusIndex_ = Convert.ToInt32(dt.Rows[0]["rowid"]); 

      foreach (DataRow dr in dt.Rows) 
      { 
       lstFaceDetectionEvent.Add(dr); 
       string strCroppedImage = GetCropImageBase64String(dr["memo"].ToString()); 
       cropImageList.Images.Add(Base64ToImage(strCroppedImage)); 
      } 

      ShowFDEvent(); 
     } 

     void tListener_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      string strSQL = string.Format("SELECT * FROM av_status_log AS A LEFT JOIN avmediaserver AS B ON A.device_id=B.DeviceId " 
             + "LEFT JOIN privilege_device AS C ON A.device_id = C.device_id " 
             + "LEFT JOIN privilege_device_group AS D ON C.device_group_id = D.device_group_id " 
             + "WHERE A.rowid > {0} AND event_type_id = 8 ORDER BY A.db_time DESC", iCurrentStatusIndex_.ToString()); 
      DataTable dt = da.GetInfoData(strSQL).Tables[0]; 

      if (dt.Rows.Count > 0) 
       iCurrentStatusIndex_ = Convert.ToInt32(dt.Rows[0]["rowid"]); 

      if (lstFaceDetectionEvent.Count >= 20) 
      { 
       lstFaceDetectionEvent.RemoveRange(0, dt.Rows.Count); 
       for (int i = 0; i < dt.Rows.Count; i++) 
       { 
        cropImageList.Images.RemoveAt(i); 
       } 
      } 

      foreach (DataRow dr in dt.Rows) 
      { 
       lstFaceDetectionEvent.Add(dr); 
       string strCroppedImage = GetCropImageBase64String(dr["memo"].ToString()); 
       cropImageList.Images.Add(Base64ToImage(strCroppedImage)); 
      } 

      ShowFDEvent(); 
      this.Refresh(); 
     } 

     public string GetCropImageBase64String(string pStrMemo) 
     { 
      XElement doc = XElement.Parse(pStrMemo); 
      string strCropImage = doc.Element("cropImage").Value; 
      return strCropImage; 
     } 

     public Image Base64ToImage(string base64String) 
     { 
      // Convert Base64 String to byte[] 
      byte[] imageBytes = Convert.FromBase64String(base64String); 
      MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length); 

      // Convert byte[] to Image 
      ms.Write(imageBytes, 0, imageBytes.Length); 
      Image image = Image.FromStream(ms, true); 
      return image; 
     } 

     private void CreateColumns() 
     { 
      ColumnHeader cropImageHeader = new ColumnHeader(); 
      cropImageHeader.Text = "Crop Image"; 
      cropImageHeader.Width = 150; 
      FDEventlistView.Columns.Add(cropImageHeader); 

      ColumnHeader timestampHeader = new ColumnHeader("Event Time"); 
      timestampHeader.Text = "Event Time"; 
      timestampHeader.Width = 150; 
      FDEventlistView.Columns.Add(timestampHeader); 

      ColumnHeader deviceNameHeader = new ColumnHeader("Device Name"); 
      deviceNameHeader.Text = "Size"; 
      deviceNameHeader.Width = 80; 
      FDEventlistView.Columns.Add(deviceNameHeader); 
     } 

     private void ShowFDEvent() 
     { 
      FDEventlistView.Items.Clear(); 
      FDEventlistView.BeginUpdate(); 
      int i = 0; 
      foreach (DataRow dr in lstFaceDetectionEvent) 
      { 
       ListViewItem item = new ListViewItem(); 
       item.ImageIndex = i; 

       ListViewItem.ListViewSubItem subitem = new ListViewItem.ListViewSubItem(); 
       subitem.Text = dr["status_time"].ToString(); 
       item.SubItems.Add(subitem); 

       subitem = new ListViewItem.ListViewSubItem(); 
       subitem.Text = dr["device_name"].ToString(); 
       item.SubItems.Add(subitem); 

       FDEventlistView.Items.Add(item); 

       i++; 
      } 

      FDEventlistView.EndUpdate(); 
     } 
    } 

你有任何想法,爲什麼?

+0

在哪一行你會得到這個異常?你調試了你的代碼嗎? – 2014-10-03 08:21:24

+0

我認爲這可能是由於兩件事情發生。1.如果您的代碼使用多個配置文件,並且在運行時無法合併這些配置文件。 2.或者代碼在運行時無法找到任何特定的dll。因此,我建議將當前程序需要的所有dll文件複製到bin文件夾中,然後嘗試運行並查看。 – 2014-10-03 08:35:43

+0

如果我通過編程方式添加usercontrol,它可以工作。我已經將所有的dll文件複製到bin文件夾中 – currarpickt 2014-10-03 08:37:55

回答

0

我不認爲這個問題是關於UserControl的。爲了證明這一點,創建一個新的用戶控件,這次不是以編程方式 - >添加新的並選擇UserControl。暫時從MainForm中刪除FaceDetectionEvent控件,然後添加新創建的UserControl並查看錯誤是否再次顯示。如果它確實請分享StackTrace的內容。

4

您的UserControl中的代碼也將在設計時運行。當您使用設計器將其放到窗體上時,該功能可提供控件的WYSIWIG行爲。但肯定可能會很麻煩,在這種情況下,你做而不是想要查詢dbase,當控件加載到Visual Studio而不是你的程序中時,你無法找到正確的連接字符串。只需通過使用DesignMode屬性跳過:

public FaceDetectionEvent() 
    { 
     InitializeComponent(); 
     tListener = new System.Timers.Timer(1000); 
     tListener.Elapsed += new System.Timers.ElapsedEventHandler(tListener_Elapsed); 
     if (!this.DesignMode) { 
      CreateColumns(); 
      GetLastTwentyEvent(); 
      tListener.Start(); 
     } 
    } 

您可能需要插入在其他地方的designMode測試你的代碼,例如油漆和Load事件處理程序。

請注意,如何調試這種僅設計時間異常會很困難,消息框並不足以顯示堆棧跟蹤。在真正困難的情況下,您可能需要調試Visual Studio本身,以便可以看到異常。啓動VS的另一個實例並使用工具+附加到進程將調試器附加到第一個實例。調試+異常,勾選投擲複選框以在拋出異常時自動中斷。

0

我有這個相同的問題,試圖通過從工具箱中拖動我的用戶控件添加到窗體。它可能看起來很明顯,但我的問題涉及在構造函數中的參數,如果該控件是以編程方式添加的,那麼它將在運行時被傳遞...

所以這段代碼會導致錯誤。爲了避免它在構造函數中沒有參數。

public ucMyControl(string title) 
{ 
    InitializeComponent(); 
    groupBox1.Text = title; 
} 
相關問題