2016-10-18 3 views
2

이 코드를 사용하여 항목을 가져 오는 CheckedListBox가 있습니다.CheckedListBox DataSource가 갑자기 작동하지 않습니다.

public static void GetDisplayValueList(object clk, string[] kv, string tableName) 
{ 
    using (SqlConnection conn = new SqlConnection(connectionString)) 
    { 
     try 
     { 
      string list = ""; 
      foreach (string item in kv) 
       list += item + ","; 
      string query = "SELECT " + list.Substring(0, list.Length - 1) + " FROM [dbo].[" + tableName + "]"; 
      SqlDataAdapter da = new SqlDataAdapter(query, conn); 
      DataSet ds = new DataSet(); 
      da.Fill(ds); 
      ((CheckedListBox)clk).DataSource = ds.Tables[0]; 
      ((CheckedListBox)clk).DisplayMember = "Description"; 
      ((CheckedListBox)clk).ValueMember = "Id"; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("An error has occurred: " + ex.Message, "Error"); 
     } 
    } 
} 

갑자기, 그것은 더 이상 작동하고 다음과 같은 오류 제공하지 않습니다 나는이 문제를 해결하기 위해 할, 또는 DataTable을에 CheckedListBox을 결합하는 방법을 다른 방법이있을 수있는 일

Exception thrown: 'System.NullReferenceException' in System.Windows.Forms.dll

을 ? 미리 감사드립니다.

+1

귀하의 DS로 전달되고 있는지 확인해야하는 것은 NULL 체크 왜 그것을 수정 프로그램입니다. 당신은 디버그를 사용할 수 있습니다! – mybirthname

+0

코드가 충분하지 않습니다. 'ds.Tables [0]'은 어디에 위치합니까? 현재 비어있어 오류가 발생합니다. – Equalsk

+0

@RoxhensMeraj Select 쿼리가 결과를 반환하지 않을 수도 있습니다. –

답변

2

답을 제공하지는 않겠지 만 코드 줄을 개선하는 데 도움이됩니다.

배열에서 문자열을 얻기 어떤 구분자로 구분 :

string list = string.Join(",", kv); 

문자열 등으로 조금 엉망 업 + 사업자가 될 것입니다 경우

string query = string.Format("SELECT {0} FROM [dbo].[{1}]", list, tableName); 

속도를 개선하고 성능, 한번만 캐스팅 시도 :

var clb = (CheckedListBox)clk; 
clb.DataSource = ds.Tables[0]; 
clb.DisplayMember = "Description"; 
clb.ValueMember = "Id"; 
+0

제안에 감사드립니다. 중단 점을 배치 할 때이 코드 줄'clb.DataSource = ds.Tables [0];에서 중단되고 ** 단계 들어가기 (F11) **를 한 번 클릭하면 ** 계속 ** 작동합니다. 나에게 그것은'clb'가 NullReferenceException을 던져 버리는 것처럼 보이지만, 나는 왜 그런지 이해할 수 없다. –

+0

'ds.Tables [0]'은 null이 아니며'Description'과'Id' 속성을 가진 요소를 가지고 있습니까? 어쩌면 첫 번째'DisplayMember'와'ValueMember' 그리고'DataSource'를 설정하는 것이 도움이 될 것입니다. –

+0

귀하의 방법은 언제 호출됩니까? 양식이 완전히 렌더링 되었습니까? –

2

답변에 대한 의견을 바탕으로 호출 스택에서 위로 올라 가야한다고 생각합니다.

원래 오류는 ((CheckedListBox)clk).DataSource = ds.Tables[0];에 있습니다. 즉, clknull이고 캐스팅 후에는 null이므로 캐스팅 후에는 CheckedListBox으로 사용할 수 없습니다. (ds.Tables[0]이 null임을 의미하는 것은 아니며 데이터를 지우려면 데이터 소스를 null으로 설정할 수 있습니다.)

그런 다음 @DDD Soft의 대답이 변경되면 오류가 아래 줄에 표시됩니다. 그 clk 밖으로

var clb = (CheckedListBox)clk;  
clb.DataSource = ds.Tables[0]; // <- error here 

이 더 포인트가 null이며, 주조 할 때, clb 이후도 null입니다.

말했다 모든, 당신은 clk

+0

나는 당신의 의견에 동의한다. 그러나 어떻게 ** System.NullReferenceException **을 체크 해제 할 때 ** 예외 설정 **에서 그 솔루션이 잘 동작 하는가? @CDspace –

관련 문제