2011-08-24 40 views
-1

我嘗試製作管理客戶端聯繫人的應用程序。該表格非常非常簡單。有:面板(在這個面板內是帶有名字,電子郵件等的標籤)和一個顯示所有保存在sdf文件中的聯繫人的列表框。我有一個大問題。我想通過另一個類中的方法刷新列表框內容。我將列表框設置爲公共,調試器在項目構建過程中不顯示任何錯誤。加載表單時,會提示此消息(通過try-catch異常):「對象引用未設置爲對象的實例」。我試圖以不同的方式完成這個項目 - 所有內容都寫在一個班級中。下面的代碼:C#錯誤:未將對象引用設置爲對象的實例

database.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Data.SqlServerCe; 

namespace Contacts 
{ 
    class Database 
    { 
     public static void RefreshListBox() 
     { 
      SqlCeConnection connection = null; 
       try 
       { 
       var form1 = Form.ActiveForm as Form1; 
       connection = new SqlCeConnection("Datasource = C:\\Kontakty.sdf"); 
       connection.Open(); 
       SqlCeCommand command = new SqlCeCommand("SELECT * FROM Contacts", connection); 
       SqlCeDataReader reader = command.ExecuteReader(); 
       while (reader.Read()) 
       { 
        form1.listBox1.Items.Add(reader.GetString(0) + " " + reader.GetString(1)); 
       } 
       } 
       catch(Exception exc) 
       { 
        MessageBox.Show(exc.Message); 

     } 
    } 
} 

Form1.cs的

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Contacts 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      Database.RefreshListBox(); 
     } 


    } 
} 

有誰知道這裏有什麼不好?

PS:kontakty =觸點(捷克;-)),因爲從1跳轉仍在加載,可能目前還無法看到,因此不活躍

+1

你有沒有試過設置一箇中斷點並逐步通過,直到你看到錯誤? – ccozad

+4

您的try塊中的哪一行會拋出異常? –

回答

0

這可能幫助:

public static void RefreshListBox(ListBox listBox) 
    ... 
    while (reader.Read()) 
    { 
    listBox.Items.Add(reader.GetString(0) + " " + reader.GetString(1)); 
    } 

然後:

private void Form1_Load(object sender, EventArgs e) 
{ 
    Database.RefreshListBox(this.listBox1); 
} 

其他,你真的不應該通過形式或列表框到數據庫類。它應該是另一種方式 - 你的表單應該從類中獲取數據並在那裏填充列表框。

+0

嗨,非常感謝! :-)這工作正常:-)。 –

0

Form.ActiveForm可能是零。

0

我會做的第一件事是將對列表框的引用傳遞給RefreshListBox()函數。

您的班級沒有理由對Form1有任何知識或參考。

試試這個在您的形式:

private void Form1_Load(object sender, EventArgs e) 
{    
     Database.RefreshListBox(this.listBox1); 
} 

這在你的類:

public static void RefreshListBox(ListBox listbox)    
{     
     SqlCeConnection connection = null; 
     try 
     { 
      listbox.Items.Clear() //I assume you may want to refresh? 

      connection = new SqlCeConnection("Datasource = "C:\\Kontakty.sdf"); 
      connection.Open();      
      SqlCeCommand command = new SqlCeCommand("SELECT * FROM Contacts", connection); 
      SqlCeDataReader reader = command.ExecuteReader(); 
      while (reader.Read()) 
      { 
       listbox.Items.Add(reader.GetString(0) + " " + reader.GetString(1)); 
      } 
     } 
     catch(Exception exc) 
     {       
      MessageBox.Show(exc.Message);     
     } 
} 

我留下了很多(如堅持選擇的項目(S)),但你明白了。

另外 - 如果您沒有指定它們的順序,請不要將字段索引用於SQL返回值。按名稱調用字段(我知道你不能使用CE SqlDataReader)或更好:在SQL語句中指定它們(和它們的順序)。您永遠不會知道數據庫何時將被移動或重新生成,並且「Select * From ...」的默認順序將被消除,如果在更高版本中添加了字段,則只會浪費帶寬/數據空間以返回其值如果你不打算使用它們。

相關問題