0

更新しました

別のコンボボックスから選択された値に基づいてコンボボックスを更新するアプリケーションがあります。たとえば、州コンボボックスのリストは、「国」コンボボックスから選択された国に基づいて入力されます。州コンボボックスのデータソースは、MySQL に基づくデータセットです。データベース。問題は、国が最初に選択された場合、州のコンボボックスが正常にロードされることですが、別の国を選択すると、州のコンボボックスに次の情報が入力されます。

  System.Data.DataViewManagerListItemTypeDescriptor

調べたところ、この問題はコンボボックスのデータソースを更新できないことに関係していることがわかりましたが、値が別のテーブルに格納されており、別のクエリが必要なため、これを行う必要があります。では、どうすればデータソースをクリアしてこの問題を解決できますか?

投稿を更新して、以下のコードを追加しました (最初は、ここで選択した値に基づいて次の値を入力する最初のコンボボックスのコードです:

  private void cboDisp1_SelectedIndexChanged(object sender, EventArgs e)
    {

        cboProd1.Enabled = false;
        cboProd1.Invalidate();
        string dispensation1;
        dispensation1 = cboDisp1.SelectedValue.ToString();
        if (dispensation1 == "1")
        {

        }
        else
        { cboProd1.Enabled = true;
        LoadDispensationCode(dispensation1,"1");
         }
    }

次のコードは、2 番目のコンボボックスに値を設定するメソッドの一部を示しています。

 private void LoadDispensationCode(string text_id,string line_no)
    {
        string txt_id=text_id;
        string ln_no=line_no;
        //MessageBox.Show(txt_id, "Value");
        txt_id = text_id;
        if (txt_id == "1")
        { }
        if
            (txt_id == "2")
        { LoadConsultation("1","1"); }
        if(txt_id=="3")
        {
            LoadDrug(ln_no);
            }.......

このコードは、MySQL データベースへのクエリに基づいてデータセットを埋め、コンボボックスをロードするメソッドを示しています。

      private void LoadDrug(string line_no)
    {  
        string ln_no;
        ln_no = line_no;
        //MessageBox.Show(ln_no,"value of text");
        if (ln_no =="1")
        {
         try
            {
                MySqlConnection connection = HopeDB.GetConnection();
                String selectStatement = "Select id,code from drugs order by id";
                MySqlCommand command = new MySqlCommand(selectStatement, connection);
                MySqlDataAdapter adapter = new MySqlDataAdapter();
                DataSet ds = new DataSet();
                adapter.SelectCommand = command;
                adapter.Fill(ds, "drugs");
                adapter.TableMappings.Add("Table", "drugs");

                   cboProd1.DisplayMember = "drugs.code";
                cboProd1.ValueMember = "drugs.id";
                cboProd1.DataSource = ds;
                connection.Close();

            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, ex.GetType().ToString()); }

        } 

    }

このコードは、別のデータセットを生成する別の方法です。

               private void LoadVaccine(string line_no)
    {

        string ln_no = line_no;
        if (ln_no == "1")
        {

            try
            {
                MySqlConnection connection = HopeDB.GetConnection();
                String selectStatement = "Select id,code from vaccines order by id";
                MySqlCommand command = new MySqlCommand(selectStatement, connection);
                MySqlDataAdapter adapter = new MySqlDataAdapter();
                DataSet ds = new DataSet();
                adapter.SelectCommand = command;
                adapter.Fill(ds, "vaccines");
                adapter.TableMappings.Add("Table", "vaccines");

                cboProd1.DisplayMember = "vaccines.code";
                cboProd1.ValueMember = "vaccines.id";
                cboProd1.DataSource = ds;
                //cboStateIDFNo.Enabled =false;
                //cboVisitType.Enabled =false;
                //cboStatus.Enabled = false;
                connection.Close();
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message, ex.GetType().ToString()); }
        } 
    }

前述のように、最初のコンボボックスが変更され、別のメソッドが呼び出されたときに、別のデータセットからの新しいデータでコンボボックスを更新する際に助けが必要です。

4

3 に答える 3

1

ComboBoxDataMember を指定できないため、s をデータセットにバインドできないと思います。その場合は、代わりに ComboBox.DataSource を問題のデータテーブルに設定してから、表示/値のメンバーを設定する必要があります。

cboProd1.DataSource = ds.Tables["drugs"];
cboProd1.DisplayMember = "code";
cboProd1.ValueMember = "id";

試してみて、お知らせください。

于 2012-05-17T16:11:27.690 に答える
0

コンボボックスデータソースを更新する方法によって異なります。

CountryComboBox_SelectedIndexChanged(...)
{
    string[] states = GetStates(CountryComboBox.SelectedItem.ToString());
    StateComboBox.DataSource = states;
}

これは機能するはずです。

于 2012-05-17T11:00:52.203 に答える
0

ここでは、コンボボックスをデータセットに直接バインドすることは避け、代わりに、UI をチェックするためだけに、小さな追加の処理レイヤーを作成します。

以下の疑似コード:

だから代わりに

//bind directly to dataset/query
comboBox.DataSource = dsCountries;

何かのようなもの

    public void Load()
    {
        //set up combobox, bind to countries
        ComboBox comboBox = new ComboBox();
        comboBox.DataSource = GetCountries(ds);
        comboBox.DisplayMember = "Name";

        //when comboBox selection changed, load countries based on selected object
        comboBox.SelectedIndexChanged += (o, s) =>
        {
            var countrySelected = (Country)comboBox.SelectedItem;

            //populate countries based on selection
        };
    }

    /// <summary>
    /// Build a list of countries, based upon the rows in a resulting dataset
    /// </summary>
    /// <param name="set"></param>
    /// <returns></returns>
    public List<Country> GetCountries(DataSet set)
    {
        List<Country> result = new List<Country>();

        foreach (DataRow row in set.Tables[0].Rows)
        {
            result.Add(new Country()
            {
                ID = (int)row.ItemArray[0],
                Name = (string)row.ItemArray[1]
            });
        }

        return result;
    }
于 2012-05-17T11:04:09.963 に答える