Сравнение с обычным текстом - плохая идея, так как «Текст»! = «Текст». В вашем случае вы можете использовать свойства DisplayMember
и ValueMember
.
Я продемонстрирую это для вас с помощью ручного заполнения списков, но вы делаете это из базы данных или как вы это делаете.
Прежде всего создайте class
, в котором будут храниться ваши значения и их идентификаторы. Я обычно создаю его так (поэтому я могу использовать этот класс позже для чего-то другого)
public class Int_String
{
public int _int { get; set; } // Important to be declared like properties and not like variables
public string _string { get; set; }
}
Теперь давайте заполним наш список следующим образом:
public YourForm()
{
List<Int_String> list = new List<Int_String>();
list.Add(new Int_String { _int = 1, _string = "Some text" }); // I am populating it manually but you will populate it from DB or somewhere else
list.Add(new Int_String { _int = 2, _string = "Some other text" });
list.Add(new Int_String { _int = 3, _string = "One more text" });
// Now when we have list we need to bind it to our listbox.
// IMPORTANT!!!!!
// Display member and Value member properties SHOULD be able to be added before and after assigning datasource to control (like combobox) BUT for some reason on listbox it only works when you assign it AFTER you bind your datasource to listbox.
// If you ever work with other controls and use these values, ALWAYS declare display member and value member BEFORE you bind datasource. Why? For now let's just say it is much faster but explanation is for other question
myListBox1.DataSource = list;
myListBox1.DisplayMember = "_string"; // When you start typing .DisplayMember, you will not get that property in recommendation since it is hidden so do not think there is not that property there.
myListBox1.ValueMember = "_int"; // Same as above
}
Теперь, когда вы заполняете списки вроде этого и второго таким же образом одинаковыми идентификаторами, вы можете просто сделать if(listbox1.SelectedValue == listbox2.SelectedValue)
и сравнить их, даже если их текст не равен, но идентификатор равен.
БОНУС:
Также вы можете расширить класс следующим образом:
public class Int_String
{
public int _int { get; set; }
public string _string { get; set; }
public string SomethingOther = "AsD";
public bool IsTrue()
{
return true;
}
}
затем связать его таким же образом и сделать это:
Int_String item = listbox1.SelectedItem as Int_String;
bool check = item.IsTrue();
MessageBox.Show(item.SomethingOther);
Таким образом, в основном вы связываете целый класс для каждого элемента в списке, отображаете пользователю одну из переменных (в нашем случае _string
), устанавливаете ValueMember
для другой уникальной переменной, чтобы можно было легко искать весь список и при необходимости получить весь класс из этого предмета.