2016-07-26 2 views
1

このトピックに関する多くの回答を見てきましたが、特定の状況で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; 
    } 
} 

誰もが私が行方不明です何で私を助けることができますか?

+0

ような何かをしようと私はあなたのSelectedIndexChangedイベントには、リストボックスの代わりに

にアイテム/オブジェクトを追加することをお勧め?リストボックスのSelectedIndexChangedイベントにlistBoxDatabase_SelectedIndexChangedプロセスのどこかが追加されなかった場合、メソッドは決して起動されません。 –

+1

私は、リストボックスアイテムが選択されているときに何をしようとしているのか、ちょっと混乱しています。最初にtbxFirstNameテキストボックスからファーストネームの顧客を作成し、tbxFirstNameのTextプロパティと同じ値を設定しようとします。 **編集:** Rahulが答えるのに数秒先だったようです。 – hankide

+0

@KelsonB​​all私はリストボックスをダブルクリックしたので、実際のオブジェクトに登録されていると思います。 – Ashton

答えて

1

のように行うことができます。その代わりに、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); 
    } 
} 

さて、あなたは、元のコードから

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; 
    } 
} 
+1

はい!スティーブはそれでした!ガー、今それは理にかなっています。私が実際に顧客クラスを持っていないうちに、これを修正してToString()が私が望むものではないことを理解しています。これは完全に機能し、私を非常に助けました。素晴らしい返答と答えをありがとう! – Ashton

+0

問題は、すでにその中にいる人を追加しようとすると、私のエラーメッセージが表示されないということです。なぜスティーブがいいの? – Ashton

+1

これは別の質問のためのものです。 CustomerクラスはIComparableインターフェイスを実装する必要があります。私は例を見つけることを試みる – Steve

1

これは、以下で見ることができるのと同じテキストなので、変更されていません。 tbxFirstName.Textのデータを持つCustomerオブジェクトを作成しており、それ自体が同じテキストボックスに再入力しようとしています。

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(); 
} 
+0

私が誤解している場合、私を許してください。私は新しいです。私は同じ箱に再び住みたいと思っています。意味私は3つのテキストボックスしか持たず、テキストをファーストネームボックスに入力して、それをリストボックスにロードしたい(これはうまくいっている)。しかし、私は、潜在的に、すべてのフィールドをクリアして、リストボックスの顧客を選択し、それが尊敬されたフィールドに埋め戻したいと思っています。あなたに何を言っているのか分かりますが、ありがとうございます!あなたが正しいです。私はちょうどこれを修正する方法がわからない:/ – Ashton

+0

リストボックスのデータでテキストボックスを埋めるしたい...右か? – Rahul

+0

はい!しかし、私はそのデータが私の問題を引き起こしていると思うので、顧客クラスに格納されている。 – Ashton

1

と直接お客様のインスタンスを取得することができますが、あなたが選択の変更、新しい顧客を毎回作成していました。しかし、リストボックスで強調表示されている新しいオブジェクトを作成するのではなく、顧客オブジェクトを選択したいとします。

編集:リストボックスに追加すると、オブジェクトではなく文字列が追加されていることにも気付きました。そのようにするには、文字列を解析し、スペースや何かで分割する必要があります。あなたは、それぞれのイベントにメソッドをサブスクライブしています。この

Customer c = (Customer)listboxDatabase.SelectedItem; 
tbxFirstName.Text = c.FirstName; 
tbxLastName.Text = c.LastName; 
tbxPhoneNumber.Text = c.PhoneNumber; 
関連する問題