2016-10-18 43 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"); 
     } 
    } 
} 

突然、それはもう動作し、次のエラーを与えていない:

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

が、私はこれを修正するために何ができるかのDataTableににCheckedListBoxをバインドする方法を他の方法があります? ありがとうございます。

+1

あなたのDSとして渡されているかどうか確認する必要があると述べているすべては、なぜチェックし、それを修正nullです。デバッグを使うことができます! – mybirthname

+0

十分なコードが表示されていません。 'ds.Tables [0]'にはどこに値が入りますか?現在は空ですので、エラーが発生します。 – Equalsk

+0

@RoxhensMeraj選択クエリが結果を返さないためです。 –

答えて

2

私は答えを提供するとは思わないが、いくつかのコードラインを改善するのに役立つだろう。

任意の区切り文字で区切ら配列から文字列を取得する:文字列は、Alとビット混乱アップとなるであろう場合

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に設定してデータを消去することができます)。

その後、@ DDD Softの回答から変更があった場合、そのclkアウト

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

このさらなるポイントがnullの場合、鋳造時に、clbはその後もnullです。

あなたはclk

+0

私はあなたに同意しますが、どうすれば** System.NullReferenceException **のチェックを外すと**例外設定**の解決策がうまくいきますか? @CDspace –

関連する問題