2016-10-18 5 views
2

Ich habe eine CheckedListBox, die diesen Code verwendet, um die Elemente zu erhalten.CheckedListBox DataSource funktioniert plötzlich nicht

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

Plötzlich es funktioniert nicht mehr und gibt den folgenden Fehler:

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

Was kann ich tun, um dies zu beheben, oder gibt es eine andere Art und Weise, wie ein CheckedListBox zu einer Datatable zu binden ? Vielen Dank im Voraus.

+1

Ihre ds ist null überprüfen, warum und beheben. Sie können debuggen! – mybirthname

+0

Sie haben nicht genügend Code angezeigt. Wo wird 'ds.Tables [0]' aufgefüllt? Es ist derzeit leer, weshalb Sie den Fehler erhalten. – Equalsk

+0

@RoxhensMeraj Vielleicht, weil Ihre Select-Abfrage keine Ergebnisse liefert. –

Antwort

2

Ich denke nicht, dass ich eine Antwort geben werde, aber ich würde Ihnen helfen, einige der Code-Zeilen zu verbessern.

eine Zeichenfolge aus einem Array bekommen, mit jedem seperator getrennt:

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

Wenn eine Zeichenfolge wird etwas messed-up mit al wird die + Operatoren:

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

Geschwindigkeit zu verbessern und Leistung, versuchen, nur einmal zu werfen:

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

Danke für die Vorschläge, wenn Sie einen Haltepunkt setzen, wo Sie gesagt haben, bricht es bei dieser Codezeile "clb.DataSource = ds.Tables [0];" und wenn ich einmal auf ** Step Into (F11) ** klicke und dann ** Weiter ** es funktioniert. Für mich scheint 'clb' die NullReferenceException zu werfen, aber ich verstehe nicht warum. –

+0

Haben Sie überprüft, ob 'ds.Tables [0] 'ist nicht null und hat Elemente mit den Eigenschaften' Description' und 'Id'? Vielleicht hilft es, zuerst 'DisplayMember' und' ValueMember' und dann 'DataSource' zu ​​setzen. –

+0

Wann wird Ihre Methode aufgerufen? Ist Ihr Formular vollständig gerendert? –

2

Basierend auf Kommentaren auf Antworten, ich Ich denke, Sie müssen in Ihrem Call-Stack nach oben gehen.

Sie sagen, der ursprüngliche Fehler ist auf ((CheckedListBox)clk).DataSource = ds.Tables[0];. Dies bedeutet clk ist null, und kann nicht nach dem Gießen zu einem CheckedListBox verwendet werden, da nach dem Gießen ist es immer noch null. (Hinweis: Dies bedeutet nicht, ds.Tables[0] null ist. Eine Datasource kann null eingestellt werden, um die Daten zu löschen.)

Dann nach den Änderungen von @DDD Softs Antwort, die Fehler auf der Linie unten.

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

dieser weiteren weist darauf hin, dass clk null ist, und beim Gießen, clb anschließend auch null.

Alles, was gesagt, müssen Sie prüfen, was als clk übergeben wird

+0

Ich stimme Ihnen zu, aber wie kommt es, dass, wenn ich die ** System.NullReferenceException ** in ** Ausnahmeeinstellungen ** deaktivieren die Lösung funktioniert? @CDSpace –

Verwandte Themen