簡體   English   中英

如何從列表框中提取所選項目作為對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM