将usercontrol添加到windows窗体c#时出错

时间:2014-10-03 08:12:43

标签: c# winforms user-controls

我创建了一个FaceDetectionEvent,它是一个用户控件,并尝试以windows形式添加它(仍然在同一个项目中)。但它一直显示这个错误: enter image description here

这是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();
        }
    }

你知道为什么吗?

3 个答案:

答案 0 :(得分: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测试,例如Paint和Load事件处理程序。

请注意如何调试此类设计时间的异常很困难,消息框不足以显示堆栈跟踪。在非常困难的情况下,您可能需要调试Visual Studio本身,以便您可以看到异常。启动VS的另一个实例并使用Tools + Attach to Process将调试器附加到第一个实例。 Debug + Exceptions,勾选Thrown复选框,以便在抛出异常时自动中断。

答案 1 :(得分:0)

我不认为问题与UserControl有关。为了证明这一点,创建一个新的用户控件,这次不是以编程方式 - &gt;添加新建,然后选择UserControl。立即从MainForm中删除FaceDetectionEvent控件,然后添加新创建的UserControl并查看错误是否再次出现。如果确实如此,请分享StackTrace的内容。

答案 2 :(得分:0)

我尝试通过从工具箱中拖动来将我的用户控件添加到表单时遇到了同样的问题。这看起来很明显,但我的问题涉及构造函数中的参数,如果以编程方式添加控件,那么这些参数是在运行时传递的......

所以这段代码会导致错误。为了避免它在构造函数中没有参数。

amount_of_names