[英]How to extract selected item from Listbox as an object
如何從列表框中提取選定項目作為對象。 目前,我正在從數據庫中獲取所有記錄,並通過以下方式將它們添加到列表框中:
var allEmployees = GetAll();
foreach (var emp in allEmployees)
{
var empFull = $"{emp.Id} - {emp.Name} {emp.Surname} - {emp.Email}";
listBoxViewEmp.Items.Add(empFull);
}
但是,我發現將 listBoxViewEmp.SelectedItem 設置為對象具有挑戰性,因為我要獲取包含 id、name、surname 和 email 的整個字符串。
private void btnUpdate_Click(object sender, EventArgs e)
{
if(listBoxViewEmp.SelectedItem != null)
{
var newForm = new UpdateForm(listBoxViewEmp.SelectedItem);
newForm.Show();
}
else
{
MessageBox.Show("Please select employee first");
}
}
處理此類問題的最佳方法是什么?
更新:這是我的嘗試,但我現在在列表框中只有對象
var allEmployees = GetAll();
foreach (var emp in allEmployees)
{
var empFull = (Employee)emp;
listBoxViewEmp.Items.Add(empFull);
}
為作為項添加到 ListBox 控件的任何對象顯示的字符串將是該對象的ToString
方法的返回值。 在您的情況下,您將字符串直接添加到列表中。 因此,(可能)無法從您為該對象創建的格式化字符串中恢復原始對象。
相反,為您的 Employee 對象覆蓋ToString
(如果合適的話)。
或者,您可以創建一個包裝類,其工作是記住原始對象並為記住的對象提供自定義ToString
實現。 這樣的通用格式化程序類可能如下所示:
public class Formatter<T>
{
public Formatter(T obj, Func<T, string> fnFormat)
{
this.obj = obj;
this.fnFormat = fnFormat;
}
public T obj;
public Func<T, string> fnFormat;
public override string ToString() => fnFormat(obj);
}
然后,當您將項目添加到列表框時,請添加一個包裝該項目的格式化程序。 將調用其ToString
方法,該方法將調用該項目的自定義格式化程序。
foreach (var employee in employees)
{
this.listBox1.Items.Add(new Formatter<Employee>(employee,
emp => $"{emp.Id} - {emp.Name} {emp.Surname} - {emp.Email}"));
}
要訪問原始 Employee,請將 SelectedItem 返回到Formatter<Employee>
並訪問其記住的對象字段obj
。 現在您有原始的 Employee 對象(或數據庫記錄或實體或任何它原來的東西)。示例用法:
private void button1_Click(object sender, EventArgs e)
{
Employee employee = (this.listBox1.SelectedItem as Formatter<Employee>)?.obj;
this.label1.Text = employee?.Id.ToString();
}
您可以為此使用數據綁定。 創建一個新的只讀屬性,它將返回您想要的計算字符串。 比ListBox
有一些你可以使用的屬性:
Datasource
- 將顯示的數據源。 您可以在這里設置簡單的List<Employee>
。DisplayMember
- 您設置屬性的名稱,即您希望在ListBox
中看到的值。ValueMember
- 您可以使用 ListBox 的SelectedValue
屬性設置要為選定項目獲取的值的屬性名稱。所以你可以這樣做:
// You should set these two properties in form's designer.
listBoxViewEmp.DisplayMember = "Info"; // "Info" is that new readonly property.
listBoxViewEmp.ValueMember = "Id";
var allEmployees = GetAll().ToList();
listBoxViewEmp.DataSource = allEmployees;
而已。 現在:
listBox.SelectedItem
返回整個Eployee
對象。listBox.SelectedValue
返回所選員工的Id
值。如果您有權訪問 Employee 類,請執行以下操作:
主要代碼:
var allEmployees = GetAll();
foreach (var emp in allEmployees)
{
var empFull = (Employee)emp;
listBoxViewEmp.Items.Add(empFull);
}
在類代碼中:
class Employee
{
...
public override string ToString()
{
return $"{this.Id} - {this.Name} {this.Surname} - {this.Email}";
}
}
現在您可以將列表框中的項目作為 Employee 獲取,它還將替換上面 ToString 中的“JustTest.Models.Employee”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.