2013-10-18 30 views
0

我在選擇winforms組合框中的適當項目時遇到困難。以前我詳細描述過here,但我認爲這個問題仍然沒有解決,因爲我使用一種形式添加/編輯記錄。等等形式負載我在組合框中選擇enum作爲SelectedItem

private void AddEditForm_Load(object sender, EventArgs e) 
    { 
     PopulateComboBoxLanguage(); 
    } 

private void PopulateComboBoxLanguage() 
{ 
    comboBoxLang.DataSource = Enum.GetValues(typeof(Book.EnumLang)); 
} 

和編輯操作我想填充與現有的數據形式,一切都被填充,它應該除外組合框,其中來自EnumLang的第一項總是顯示。 從我的第二個構造我叫PopulateWithExisingData(book),我使用

comboBoxLang.SelectedItem = book.Language; 

但即使通過book.Language設置爲德語SelectedItem總是在調試模式下空。

p.s.我也嘗試comboBoxLang.SelectedItem = (book.EnumLang)book.Language;也與SelectedValue但保持不變。

再次我猜這個問題是在頁面加載時填充組合框,但我不知道是否以及如何解決這個問題。

請詢問更多信息。

+1

'comboBoxLang.SelectedItem = book.Language;'你在哪裏有這條線? –

+0

裏面的構造函數我發送書籍對象,除了其他屬性語言屬性。在頁面加載我填充組合框的值,但我需要選擇適當的不默認的。 – user2783193

+0

@SriramSakthivel內部PopulateWithExisingData(書)方法編輯動作 – user2783193

回答

2
  1. 聲明您正在窗體中添加/編輯的對象類型的實例。
  2. 添加布爾isEdit到窗體,並將其設置爲false
  3. 添加一個方法public void初始化(對象類型名稱)
  4. 你的初始化方法應該設置表單實例等於參數,並應設置一個布爾標誌isEdit = true。
  5. 將所有加載數據/填充控件的代碼(如組合框)放入窗體加載事件中。
  6. 在您的Load事件的底部,之後你的控件是做人口

    if (isEdit) 
        { 
         //Set your controls selected values from the object you are editing 
        } 
    

現在,對於新對象,只是讓你的表單,並調用顯示或在它的ShowDialog。這將導致Load事件觸發並且您的控件將會填充。

對於編輯,製作表單,調用Initialize,然後執行Show/ShowDialog。由於Initialize方法設置爲isEdit = true,因此加載事件底部的if(isEdit)代碼塊將被命中,控件值將設置爲等於正在編輯的對象的屬性。

下面是一些很簡單的例子代碼:

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //This is simulating an add...First Language will be displayed on form2, 
     //which is English 
     Form2 form = new Form2(); 
     form.ShowDialog(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     //This is simulating an edit...this will display french 
     //(or whatever is passed in) 
     Form2 form = new Form2(); 
     form.Initialize(Languages.French); 
     form.ShowDialog(); 
    } 

Languages editValue; 
    bool isEdit = false; 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public void Initialize(Languages var) 
    { 
     editValue = var; 
     isEdit = true; 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     comboBox1.DataSource = Enum.GetValues(typeof(Languages)); 

     if (isEdit) 
     { 
      comboBox1.SelectedItem = editValue; 
     } 
    } 

public enum Languages 
{ 
    English = 0, 
    French = 1, 
    Spanish = 2, 
    German = 3 
} 
+0

感謝您的時間。 – user2783193

+0

沒問題,很高興我可以幫忙 –

1

設置DataSource時,傳遞一個對象數組。 當您設置SelectedItem時,您傳遞一個枚舉值,以便它再次裝箱到一個對象。 ComboBox使用方法IndexOf在DataSource值中搜索您的項目,該方法使用Object.Equals方法將這些值與您的新值進行比較。由於它們是不同的對象(引用不同),因此在DataSource集合中永遠找不到您的項目,因此選擇內容不會更改。

+0

我不知道這是否合理,因爲OP的代碼對我來說完美無缺。 – nawfal