1

BindingList< KeyValuePair < string, string > >コントロールにバインドされた がありますComboBox。いくつかの条件に基づいてBindingList、新しい が追加されKeyValuePairます。現在、新しく追加されたアイテムはCombobox、末尾ではなく、のインデックス 0 に表示されます。

BindingListデバッグ中に、の順序が正しいことがわかりました。(つまり、newKeyValuePairが追加されます)

また、ハンドラーの を確認したところ、選択されたものではないSelectedValueようComboBoxです。代わりに、 がその のように正しい順序を持っていた場合、想定されている のそれです- ..SelectedIndexChangedListItemListItemComboBoxDataSourceBindingList

コードは大規模なプロジェクトの一部です..質問が明確でない場合はお知らせください。コンテキストに従って、コードの関連部分を配置できます。

どうしてこのようなことが起こるのでしょうか? 他に何ができますか?

私はこのようなクラスを持っています。

public class DropdownEntity
{
    //removed all except one members and properties

    private string frontEndName
    public string FrontEndName
    {
        get {return this.frontEndName; }
        set {this.frontEndName= value; }
    }

    //One Constructor
    public DropdownEntity(string _frontEndName)
    {
        this.FrontEndName = _frontEndName;

        //Removed code which initializes several members...
    }

    //All methods removed..

    public override string ToString()
    {
        return frontEndName;
    }
}

私の Windows フォームには、複数のタブを持つタブ コントロールがあります。タブ ページの 1 つに、DataGridView があります。ユーザーはセルを編集して [次へ -] ボタンをクリックする必要があります。次に、いくつかの処理が実行され、TabControl が次のタブ ページに移動します。

次のタブ ページには、私が言及した問題のあるコンボボックスがあります。このページには戻るボタンもあり、元に戻ります。ユーザーはグリッドビューのセルを再度変更し、次のボタンをクリックできます。順番がめちゃくちゃになる時です。

ここに、Next ボタンの Click イベント ハンドラーを投稿します。クラスと共に、残りのコードを削除します。

public partial class AddUpdateWizard : Form
{        
    //Removed all members..

    BindingList<KeyValuePair<string, string>> DropdownsCollection;
    Dictionary<string, DropdownEntity> DropdownsDict;

    //Defined in a partial definition of the class..
    DataGridView SPInsertGridView = new DataGridView();
    ComboBox DropdownsCmbBox = new ComboBox();

    Button NextBtn2 = new Button();
    Button BackBtn3 = new Button();
    //Of course these controls are added to one of the panels

    public AddUpdateWizard(MainForm mainForm)
    {
        InitializeComponent();
        DropdownsDict = new Dictionary<string, DropdownEntity>();
    }

    private void NextBtn2_Click(object sender, EventArgs e)
    {
        string sqlArgName;
        string frontEndName;
        string fieldType;

        for (int i = 0; i < SPInsertGridView.Rows.Count; i++)
        {
            sqlArgName = "";
            frontEndName = "";
            fieldType = "";

            sqlArgName = SPInsertGridView.Rows[i].Cells["InsertArgName"].Value.ToString().Trim();

            if (SPInsertGridView.Rows[i].Cells["InsertArgFrontEndName"].Value != null)
            {
                frontEndName = SPInsertGridView.Rows[i].Cells["InsertArgFrontEndName"].Value.ToString().Trim();
            }

            if (SPInsertGridView.Rows[i].Cells["InsertArgFieldType"].Value != null)
            {
                fieldType = SPInsertGridView.Rows[i].Cells["InsertArgFieldType"].Value.ToString().Trim();
            }

            //I could have used an enum here, but this is better.. for many reasons.
            if (fieldType == "DROPDOWN")
            {
                if (!DropdownsDict.ContainsKey(sqlArgName))
                    DropdownsDict.Add(sqlArgName, new DropdownEntity(frontEndName));
                else
                    DropdownsDict[sqlArgName].FrontEndName = frontEndName;
            }
            else
            {
                if (fieldType == "NONE")
                    nonFieldCount++;

                if (DropdownsDict.ContainsKey(sqlArgName))
                {
                    DropdownsDict.Remove(sqlArgName);
                }
            }

        }

        //DropdownsCollection is a BindingList<KeyValuePair<string, string>>.
        //key in the BindingList KeyValuePair will be that of the dictionary.
        //The value will be from the ToString() function of the object in the Dictionary. 

        DropdownsCollection = new BindingList<KeyValuePair<string,string>>(DropdownsDict.Select(kvp => new KeyValuePair<string, string>(kvp.Key, kvp.Value.ToString())).ToList());

        DropdownsCmbBox.DataSource = DropdownsCollection;

        DropdownsCmbBox.DisplayMember = "Value";
        DropdownsCmbBox.ValueMember = "Key";            

        //Go to the next tab
        hiddenVirtualTabs1.SelectedIndex++;
    }

    private void BackBtn3_Click(object sender, EventArgs e)
    {
        hiddenVirtualTabs1.SelectedIndex--;
    }

    //On Selected Index Changed of the mentioned Combobox..        
    private void DropdownsCmbBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (DropdownsCmbBox.SelectedValue != null)
        {
            if (DropdownsDict.ContainsKey((DropdownsCmbBox.SelectedValue.ToString())))
            {
                var dropdownEntity = DropdownsDict[DropdownsCmbBox.SelectedValue.ToString()];

                DropdownEntityGB.Text = "Populate Dropdowns - " + dropdownEntity.ToString();

                //Rest of the code here..
                //I see that the Datasource of this ComboBox has got the items in the right order.
                // The Combobox's SelectedValue is not that of the selected item. Very Strange behavior!!

            }
        }
    }
}

ユーザーが初めて [次へ] ボタンをクリックしたときは問題ありません。しかし、もう一度 [戻る] ボタンをクリックしてデータ グリッド ビューのセルを変更すると、順序が失われます。

私は知っています、それを見るのはイライラするかもしれません。助けを求めることは大変なことです。どんな助けでも大歓迎です!

どの部分でも詳細が必要な場合はお知らせください。

どうもありがとう :)

4

2 に答える 2