使用列表框中的文本填充文本框

时间:2016-07-26 16:45:15

标签: c# listbox

我已经查看了很多关于这个主题的答案,但没有找到解决办法,因为我的特殊情况使用了一个名为Customer的类,我试图将名为tbxFirstName的文本框设置为我点击的所选名称在列表框中设置tbxFirstName.Text = cust.getFirstName;

我无法弄清楚为什么它没有用所选项目中的字符串重新填充名字文本框。

这是我的代码。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        listBoxDatabase.Name = "CUSTOMERS";
    }

    private void btnAddCustomer_MouseClick(object sender, MouseEventArgs e)
    {
        Customer cust = new Customer(tbxFirstName.Text, tbxLastName.Text, tbxPhone.Text);

        if (listBoxDatabase.Items.Contains(cust.ToString()))
        {

            MessageBox.Show("Customer Already Exist!", "ERROR");
        } else
        {
            listBoxDatabase.Items.Add(cust.ToString());
        }
    }

    private void listBoxDatabase_SelectedIndexChanged(object sender, EventArgs e)
    {
        Customer cust = new Customer(tbxFirstName.Text, tbxLastName.Text, tbxPhone.Text);

        tbxFirstName.Text = cust.getFirstName;
    }
}
class Customer
{
    //Variables
    private string firstName, lastName, phone;

    //Constructor
    public Customer(string firstName, string lastName, string phone)
    {
        this.firstName = firstName;
        this.lastName = lastName;
        this.phone = phone;
    }

    public string getFirstName
    {
        get
        {
            return firstName;
        }
    }

    public string getLastName
    {
        get
        {
            return lastName;
        }
    }

    public string getPhone
    {
        get
        {
            return phone;
        }
    }

    public override string ToString()
    {
        return firstName + " " + lastName + " " + phone;
    }
}

任何人都可以帮助我解决我所缺少的问题吗?

3 个答案:

答案 0 :(得分:1)

嗯,它没有改变,因为它与下面的文字相同。您正在使用Customer中的数据创建tbxFirstName.Text对象,并且您尝试在同一文本框中重新填充该数据。

    Customer cust = new Customer(tbxFirstName.Text, tbxLastName.Text, tbxPhone.Text);

    tbxFirstName.Text = cust.getFirstName;

根据您的评论,您希望使用列表框选择的项目文本填充文本框。在这种情况下,您可以像

一样
private void listBoxDatabase_SelectedIndexChanged(object sender, EventArgs e)
{
    tbxFirstName.Text = listBoxDatabase.SelectedItem.ToString();
}

答案 1 :(得分:1)

您的问题是由您在ListBox项目中存储字符串引起的。相反,您应该存储Customer实例并检索Customer实例

您的Customer类包含ToString的覆盖,因此ListBox在需要显示项时调用自身,但ListBox存储的基础数据对象是完整的Customer对象

private void btnAddCustomer_MouseClick(object sender, EventArgs e)
{
    Customer cust = new Customer(tbxFirstName.Text, tbxLastName.Text, tbxPhone.Text);

    // This will replace the Contains because now you have 
    // a collection of Customer not a collection of strings.
    if (listBoxDatabase.Items.Cast<Customer>()
                       .Any(x => x.ToString() == cust.ToString())) 
    {
        MessageBox.Show("Customer Already Exist!", "ERROR");
    }
    else
    {
        // Add a customer, not its ToString representation
        listBoxDatabase.Items.Add(cust);
    }
}

现在,您可以使用

直接检索Customer实例
private void listBoxDatabase_SelectedIndexChanged(object sender, EventArgs e)
{

    if (listBoxDatabase.SelectedIndex != -1)
    {
        Customer cust = listBoxDatabase.Items[listBoxDatabase.SelectedIndex] as Customer;
        tbxFirstName.Text = cust.getFirstName;
        tbxLastName.Text = cust.getLastName;
        tbxPhone.Text = cust.getPhone;
    }
}

答案 2 :(得分:1)

从您发布的原始代码中,您每次选择更改时都会创建一个新客户。但是您希望选择列表框中突出显示的客户对象 - 而不是创建一个全新的客户对象。

编辑:我还注意到,当您添加到列表框时,您正在添加字符串,而不是对象。如果你想这样做那么你需要解析字符串并通过空格或其他东西将其分解。我建议将项目/对象添加到列表框中

在您的SelectedIndexChanged事件中尝试类似这样的事情

Customer c = (Customer)listboxDatabase.SelectedItem;
tbxFirstName.Text = c.FirstName;
tbxLastName.Text = c.LastName;
tbxPhoneNumber.Text = c.PhoneNumber;