7

と呼ばれるコンボボックスがあり、値と表示名としてcombobox1入力します。チュートリアルを検索して読んだところ、フォームの読み込みイベントで使用するこのコードが見つかりましたが、リストに表示されません。空のドロップダウンが表示されます。私がどこが間違っているかについてのアイデアはありますか?idName

私のデータベースクラスには、この関数があります。

public static void FillDropDownList(string Query, System.Windows.Forms.ComboBox DropDownName)
{
   SqlDataReader dr;

   SqlConnection myConnection = new SqlConnection(CONNECTION_STRING);
   try
   {
      myConnection.Open();
   }
   catch (Exception e)
   {
      Console.WriteLine(e.ToString());
   }

   // Check whether the Drop Down has existing items. If YES, empty it.
   if (DropDownName.Items.Count > 0)
      DropDownName.Items.Clear();

   SqlCommand cmd = new SqlCommand(Query, myConnection);
   dr = cmd.ExecuteReader();

   while (dr.Read())
      DropDownName.Items.Add(dr[0].ToString());

   Console.Write(DropDownName.Items.Add(dr[0].ToString()));
   dr.Close();
}

私の形では、私はそれを次のように呼んでいます

private void sales_record_Load(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(DBUtils.CONNECTION_STRING);
    DBUtils.FillDropDownList("select id,Name from Farms", comboBox1);
}
4

3 に答える 3

11

これはあなたが探していることをするはずです。設計の観点から見た問題は、このクエリをコーディングする人は、返される最初の2つの列がそれぞれIDと表示項目を反映している必要があることに注意する必要があるということです。それ以外は、実際の列名は重要ではありません。ValueMemberプロパティとDisplayMemberプロパティ(データソース内のそれぞれの列の文字列名)は、Column[0]とColumn[1]への序数参照によって取得されるためです。

各DataAccessオブジェクト(SQLConnectionインスタンスとSQLCommandインスタンスをブロックの使用でラップしたことに注意してください。これは、管理されていないリソースを消費する傾向があり、破棄する必要があるデータアクセスオブジェクトに推奨される方法です。usingブロックは、の破棄を処理します。各オブジェクトを使用します。各usingブロックには独自のスコープが含まれていることに注意してください。

お役に立てば幸いです。

更新:@Neoliskは、私が作曲しているときに彼の答えを投稿しました。それらは重複していませんが、同じ分野の多くをカバーしています。彼の答えとこれの間で、あなたはあなたが必要とするものを持っているべきです!

public void FillDropDownList(string Query, ComboBox DropDownName)
{
    // If you use a DataTable (or any object which implmenets IEnumerable)
    // you can bind the results of your query directly as the 
    // datasource for the ComboBox. 
    DataTable dt = new DataTable();

    // Where possible, use the using block for data access. The 
    // using block handles disposal of resources and connection 
    // cleanup for you:
    using (var cn = new SqlConnection(CONNECTION_STRING))
    {
        using(var cmd = new SqlCommand(Query, cn))
        {
            cn.Open();

            try
            {
                dt.Load(cmd.ExecuteReader());
            }
            catch (SqlException e)
            {
                // Do some logging or something. 
                MessageBox.Show("There was an error accessing your data. DETAIL: " + e.ToString());
            }
        }
    }

    DropDownName.DataSource = dt;
    DropDownName.ValueMember = dt.Columns[0].ColumnName;
    DropDownName.DisplayMember = dt.Columns[1].ColumnName;
}
于 2013-01-01T22:59:17.217 に答える
8

私のアドバイス-.NETの組み込み機能を可能な限り使用し、データバインディングを手動で処理しないでください(これは、コードで実行しようとしていることです)。

  1. ExecuteQueryを使用して、データベースからDataTableをプルします。
  2. DropDownName.DataSource=yourDataTableを設定します。
  3. DropDownName.ValueMember="id"を設定します。
  4. DropDownName.DisplayMember="Name"を設定します。

したがって、コードは次のようになります。

public static void FillDropDownList(string Query, System.Windows.Forms.ComboBox DropDownName)
{
  DataTable dt;

  using (var cn = new SqlConnection(CONNECTION_STRING))
  {
    cn.Open();

    try
    {
      SqlCommand cmd = new SqlCommand(Query, cn);
      dt = cmd.ExecuteQuery();
    }
    catch (SqlException e)
    {
      Console.WriteLine(e.ToString());
      return;
    }
  }

  DropDownName.DataSource = dt;
  DropDownName.ValueMember = "id";
  DropDownName.DisplayMember = "Name";
}

例外タイプをに変更したことに注意してくださいSqlException。データベースエラーのみを検索しています。他のすべては爆破します。いつmyConnection.Open();例外がスローされるかは覚えていないので、tryブロックはあまり役に立ちません。私のtry句に注意してください-それはExecuteQueryその中にあり、失敗する可能性があります。

編集:構成を使用する場合、ブロック内の接続を閉じる必要finallyusingはありません。したがって、削除することができます-その結果、コードはよりコンパクトになります。

于 2013-01-01T22:35:13.550 に答える
3

@Neoliskのコードを使用して動作させることができました。次のようなコードにいくつかの小さな変更を加えただけです。

public static void FillDropDownList(string Query, System.Windows.Forms.ComboBox DropDownName)
        {
            using (var cn = new SqlConnection(CONNECTION_STRING))
            {
                cn.Open();
                DataTable dt = new DataTable();
                try
                {
                    SqlCommand cmd = new SqlCommand(Query, cn);
                    SqlDataReader myReader = cmd.ExecuteReader();
                    dt.Load(myReader); 
                }
                catch (SqlException e)
                {
                    Console.WriteLine(e.ToString());
                    return;
                }
                DropDownName.DataSource = dt;
                DropDownName.ValueMember = "id";
                DropDownName.DisplayMember = "Name";
            }


        }
于 2013-01-02T07:38:38.660 に答える