2016-04-12 135 views
0

Combobox從SQL數據庫中提取名稱列,但是選中時需要將dentist列表中的其他屬性填充到標記爲TextBoxes的列表中。從組合框中選擇時無法填充列表集合

If聲明是我得到的錯誤,突出顯示的代碼是dent.Name。錯誤如下:

描述:無法隱式轉換類型 '字符串' 到 '廉政'

namespace DentistSurgery 
{ 
    public partial class Dentist_Info : Form 
    { 
     Surgery mySurgery = new Surgery(); 
     public SqlCommand SelectCommand; 
     private SqlDataAdapter da; 
     DataRow dr; 
     Surgery _formsSurgery;   

     public Dentist_Info(Surgery SurgeryToDisplay) 
     {  
      _formsSurgery = SurgeryToDisplay;     
     } 

     public void FillCombo() 
     { 
      using (SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True")) 
      { 
       SqlCommand SelectCommand = new SqlCommand("SELECT * FROM DentistInfo", conn); 
       conn.Open(); 
       DataSet ds = new DataSet(); 
       SqlDataAdapter da = new SqlDataAdapter(SelectCommand); 
       da.Fill(ds); 

       foreach (DataRow dr in ds.Tables[0].Rows) 
       { 
        comboBox1.Items.Add(dr["DentistName"].ToString()); 
       } 
       //conn.Close(); 
      } 
     } 

     public Dentist_Info() 
     { 
      InitializeComponent(); 
      FillCombo();   
     } 

     public void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      List<Dentist> dentistList = new List<Dentist>(); 
      Dentist dent = new Dentist(); 

      if (comboBox1.SelectedIndex = dent.Name) 
      { 
       txtDName.Text = dent.Name.ToString(); 
       txtDSurname.Text = dent.Surname; 
       txtDDOB.Text = dent.DOB.ToString(); 
       txtGender.Text = dent.Gender; 
       txtSalary.Text = dent.Salary.ToString(); 
      } 
     } 
+0

請不要張貼鏈接到您的代碼的圖片。只需像您對代碼的其餘部分所做的那樣發佈代碼即可。 – Jacobr365

+0

對不起,我不會這樣做。 – Griff

回答

1

SelectedIndex屬性是int類型的,你想它有一個字符串值進行比較。您需要使用ToString()方法將其轉換爲字符串,你也應該使用賦值運算符=平等操作==,而不是在你的if聲明是這樣的:

if (comboBox1.SelectedIndex.ToString() == dent.Name) 
{ 
    .... 

但基於dent.Name我認爲你應該在這裏使用SelectedItem屬性但同樣因爲SelectedItem的類型爲object你應該使用ToString()

if (comboBox1.SelectedItem.ToString() == dent.Name) 
{ 
    ... 
+0

非常感謝,這幫助了錯誤 – Griff

+0

是的,它確實解決了我最初的錯誤,但是現在我有一個問題,因爲我試圖填充到文本框中的字符串是空的,因爲我創建了一個牙醫的新實例和牙醫。 我知道這是一個單獨的問題,所以我需要關閉這個並開始另一個。 或者你能否回答我如何實例化牙醫或牙醫清單而不創建新的實例。 – Griff

1

dent是新的,空的對象。 dent.Name給出空string,並且不能將隱式轉換爲stringintegerSelectedIndex

編輯: 由於其他問題(和其他問題),這裏是更多的代碼。

因此,您的dentistList爲空,並且dentist也爲空。在這種情況下,比較牙醫與選定的項目是沒有用的。 嘗試像這樣重新排列你的代碼。我還添加了一些評論:

//I'm assuming this is form 
public partial class Dentist_Info : Form 
{ 
    //create list of dentists here, so that it is visible thru whole form. 
    private List<Dentist> dentistList = new List<Dentist>(); 

    public Dentist_Info(Surgery SurgeryToDisplay) 
    { 

     _formsSurgery = SurgeryToDisplay; 


    } 

    public void FillComboAndListOfDentists() 
    { 
     using (SqlConnection conn = new SqlConnection(@"Data Source = GGJG; Initial Catalog = DentistDB; Integrated Security = True")) 
     { 
      SqlCommand SelectCommand = new SqlCommand("SELECT * FROM DentistInfo", conn); 
      conn.Open(); 
      DataSet ds = new DataSet(); 
      SqlDataAdapter da = new SqlDataAdapter(SelectCommand); 
      da.Fill(ds); 

      foreach (DataRow dr in ds.Tables[0].Rows) 
      { 
       comboBox1.Items.Add(dr["DentistName"].ToString()); 

       // creating new dentist 
       Dentist dent = new Dentist(); 
       dent.Name = dr["DentistName"].ToString(); 
       dent.Surname = dr["DentistSurname"].ToString(); 
       //etc... 

       //add dentist to list 
       dentistList.Add(dent); 
      } 
      //conn.Close(); 
     } 
    } 


    public Dentist_Info() 
    { 

     InitializeComponent(); 
     FillComboAndListOfDentists();   

    } 

    public void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //use LINQ to find specific dentist in the list (btw, you should use something unique, some kind of ID, not just Name 
     Dentist dent = dentistList.FirstOrDefault(d => d.Name == comboBox1.SelectedValue); 

     // once you have your dentist, fill all the details... 
     if (dent != null) 
     { 
      txtDName.Text = dent.Name.ToString(); 
      txtDSurname.Text = dent.Surname; 
      txtDDOB.Text = dent.DOB.ToString(); 
      txtGender.Text = dent.Gender; 
      txtSalary.Text = dent.Salary.ToString(); 

     } 


    } 
} 
+0

謝謝你的回覆,我不知道SelectIndex是int類型的。 但是我現在已經能夠通過轉換爲字符串來擺脫錯誤,但是您已經提出了另一點,我試圖填充的字符串是空的,因爲它是新的。 我該如何解決這個問題,我如何實例化這個列表,而不用說它是新的,甚至牙醫 – Griff

+0

,如果陳述是無用的。首先,你的牙醫名單應該填寫數據(你可以很容易地將'dentistList'聲明從'comboBox1_SelectedIndexChanged'方法中移出,放入課堂並填入你用來填充組合的相同數據,然後你就可以從這個列表中選擇使用combobox名稱的特定牙醫(例如:var dentist = dentistList.FirstOrDefault(d => d.Name == comboBox1.SelectedValue);'然後,變量'dentist'將包含需要顯示的數據texboxes – Nino

+0

牙醫在一個手術課上,我打電話給牙醫,這樣我就可以在手術課上的牙醫診所裏打電話給商店 – Griff

2

您沒有使用等號運算符(==)。您正在使用賦值運算符(=)。因此,爲什麼你的錯誤......

"Cannot implicitly convert type 'string' to 'int' DentistSurgery"

因爲你要選擇的指標(這是int型)將一個字符串賦值。

這意味着你應該使用comboBox1.SelectedValue(它是字符串類型)。然後你可以使用等號(= =)的值進行比較是這樣的...

if (comboBox1.SelectedValue == dent.Name) 
{ 
    // Do stuff here. 
} 
+0

中使用這個清單<>。謝謝你現在有道理。 – Griff

1

一個更好的辦法是讓selected Value˚F從comboBox使用comboBox1.SelectedValue,然後將其與dentName進行比較。

public void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     List<Dentist> dentistList = new List<Dentist>(); 
     Dentist dent = new Dentist(); 


     if (comboBox1.SelectedValue == dent.Name) 
     { 
      txtDName.Text = dent.Name.ToString(); 
      txtDSurname.Text = dent.Surname; 
      txtDDOB.Text = dent.DOB.ToString(); 
      txtGender.Text = dent.Gender; 
      txtSalary.Text = dent.Salary.ToString(); 

     } 


    } 
+0

comboBox1.SelectedValue ** == ** dent.Name) – Nino

+0

謝謝NiNo,更新了答案:) – Agalo