2011-08-24 2 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; 

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

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


    } 
} 

여기 사람이 무엇이 잘못 알고 있나요

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를 : 여기 코드는?

PS : From1 여전히로드 아마도 아직 보이지 때문에 활성화되지 않기 때문에 kontakty = 접점 (체코는; -)

+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);     
     } 
} 

나는 (선택 항목 (들)을 지속 등)을 많이 남겨 두었다 있지만, 아이디어를 얻으십시오.

또한 주문을 지정하지 않으면 SQL 반환 값에 필드 색인을 사용하지 마십시오. 이름으로 필드를 호출하십시오 (CE SqlDataReader를 사용할 수 없다는 것을 알고 있습니다). 또는 SQL 문에서 필드를 지정할 수 있습니다. DB가 이동되거나 다시 생성 될 때 절대 알지 못하며 "Select * From ..."의 기본 순서가 munged되고 필드가 이후 버전에 추가되면 대역폭/데이터 공간을 낭비하여 값을 반환합니다 만약 당신이 그들을 사용하지 않을거야.

관련 문제