2011-07-27 108 views
2

嗨我想从一个简单的数据库,我已经创建使用主窗体上的一个单独的控件创建一些数据。但是,当我尝试在设计器视图中查看主窗体时,该程序仍在运行。我得到此异常“ExecuteReader:Connection属性尚未初始化”。C#ADO.NET异常:ExecuteReader:连接属性尚未初始化

这是我的GetControl代码:

namespace Controls 
{ 
    public partial class GetControl : UserControl 
    { 
     private SqlCeConnection mConnection = null; 
     private SqlCeDataReader dataReader = null; 

     public SqlCeConnection Connection 
     { 
      set { mConnection = value; } 
     } 

     public GetControl() 
     { 
      InitializeComponent(); 
     } 

     private void GetControl_Load(object sender, EventArgs e) 
     { 
      getData(); 
      addData(); 
     } 

     private void getData() 
     { 
      SqlCeCommand command = new SqlCeCommand("SELECT FirstName, LastName FROM Contacts", mConnection); 
      dataReader = command.ExecuteReader(); 
     } 

     private void addData() 
     { 
      while (dataReader.Read()) 
      { 
       contactList.Items.Add(dataReader.GetString(0) + " " 
        + dataReader.GetString(1)); 

      } 
     } 
    } 
} 

而我的主要形式有:

namespace Phonebook_Application 
{ 
    public partial class Phonebook_MainForm : Form 
    { 
     SqlCeConnection con = new SqlCeConnection("Data Source=Phonebook.sdf;Persist Security Info=false;"); 

     public Phonebook_MainForm() 
     { 
      InitializeComponent(); 
      con.Open(); 
      getControl1.Connection = con; 
     } 
    } 
} 

这一切似乎正常工作,如果我打电话的getData()和addData()的按钮处理程序,但不是在表单加载。该项目仍然运行没有错误我只是在试图查看主窗体中的设计器视图时得到该异常。

回答

1

发生这种情况是因为Visual Studio在Designer中创建了表单的实例,所以会执行任何_Load类型的事件和默认构造函数。

您可以通过检查DesignMode属性来检查您是否在设计时间,虽然有limitations但您的案例DesignMode应该足够了。

例子:

void MyMainForm() 
{ 
    InitializeComponent(); 

    //Do any UI Init Stuff (Icons etc.) here. 

    if (!DesignMode) 
    { 
    //Business Logic (call databases etc.) here. 
    } 
} 
+0

^_ ^嘿非常感谢我补充说,我GetControl_Load方法和现在的伟大工程。 – Daniel

+0

如果这是有用的,你会如此友善以将其标记为答案并进行投票,这就是这个网站的工作原理:http://stackoverflow.com/faq#howtoask? – DaveShaw

相关问题