BindingList< KeyValuePair < string, string > >
コントロールにバインドされた がありますComboBox
。いくつかの条件に基づいてBindingList
、新しい が追加されKeyValuePair
ます。現在、新しく追加されたアイテムはCombobox
、末尾ではなく、のインデックス 0 に表示されます。
BindingList
デバッグ中に、の順序が正しいことがわかりました。(つまり、newKeyValuePair
が追加されます)
また、ハンドラーの を確認したところ、選択されたものではないSelectedValue
ようComboBox
です。代わりに、 がその のように正しい順序を持っていた場合、想定されている のそれです- ..SelectedIndexChanged
ListItem
ListItem
ComboBox
DataSource
BindingList
コードは大規模なプロジェクトの一部です..質問が明確でない場合はお知らせください。コンテキストに従って、コードの関連部分を配置できます。
どうしてこのようなことが起こるのでしょうか? 他に何ができますか?
私はこのようなクラスを持っています。
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!!
}
}
}
}
ユーザーが初めて [次へ] ボタンをクリックしたときは問題ありません。しかし、もう一度 [戻る] ボタンをクリックしてデータ グリッド ビューのセルを変更すると、順序が失われます。
私は知っています、それを見るのはイライラするかもしれません。助けを求めることは大変なことです。どんな助けでも大歓迎です!
どの部分でも詳細が必要な場合はお知らせください。
どうもありがとう :)