2010-09-20 94 views
4

我一直在試圖將一個文本文件加載到組合框中,然後製作一個按鈕以將我在組合框中所做的任何更改保存迴文本文件。C#:實時組合框更新

問題是,當我在我的組合框中鍵入某些東西時,所選的「項」不會更新。我可以更改句子,但只要單擊「保存」按鈕,該按鈕也會更新組合框,它會在我編輯它之前返回。

此外,當我編輯組合框並單擊下拉箭頭時,它會再次顯示文本文件的內容,而不會再編輯我的文章。

我一直在尋找一段時間,但似乎沒有人知道如何做到目前爲止。 :P

private void cbBanken_SelectedValueChanged(object sender, EventArgs e) 
{ 
    this.cbBanken.Update(); 
} 

我以爲這樣的東西可能會起作用,但它什麼也沒有做。我確實設法在更改後將新項目添加到列表中,但那不是我想要的。我希望能夠編輯項目,而不是添加一個新項目。

我希望這足夠詳細。感謝您的時間!

編輯:好的,只有一件事:「它只會更新我改變的第一個字符,所以如果我在任何地方使用退格,它會更新,然後我必須重新啓動,然後它會再次更新。走到組合框最左邊,這可能會很煩人。如果有人知道如何解決這個問題,我會非常感激。「

我目前使用此代碼:

private void comboBox1_TextChanged(object sender, EventArgs e) 
{ 
    if(comboBox1.SelectedIndex>=0) 
    { 
     int index = comboBox1.SelectedIndex; 
     comboBox1.Items[index] = comboBox1.Text; 
    } 

} 
+1

當「編輯」用小跟進有關的問題,不重寫整個事情,否則以前的答案是沒有意義的,新來者有不知道你在說什麼。只需將您的編輯附加到原始問題的結尾即可。 – 2010-09-21 04:10:07

回答

3

ComboBox.Update方法只是重繪組合框區域。 據我所知,你想在運行時更改組合框選定的項目。在這種情況下,您可能需要使用TextUpdate事件。 Combobox選擇的索引會自動停止編輯。所以還有另一種方法。追蹤價值變化。下面的代碼片段:

private int editedIndex = -1; 
    private String editString = ""; 
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (editedIndex == comboBox1.SelectedIndex) return; 
     if(editedIndex>0) comboBox1.Items[editedIndex] = editString; //Change the previous item 
     if(comboBox1.SelectedIndex>=0)   //get new item parameters 
     { 
      editedIndex = comboBox1.SelectedIndex; 
      editString = comboBox1.Items[editedIndex].ToString(); 
     } 
    } 


    private void comboBox1_Leave(object sender, EventArgs e) 
    { 
     if(editedIndex>=0) 
      comboBox1.Items[editedIndex] = editString; 
    } 

    private void comboBox1_TextUpdate(object sender, EventArgs e) 
    { 
     if (editedIndex >= 0) 
     { 
      editString = comboBox1.Text; 
     } 
    } 

    private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if(e.KeyData==Keys.Enter&&editedIndex>=0) 
      comboBox1.Items[editedIndex] = editString; 
    } 
+0

你是最好的!最終的代碼工作!我現在唯一的問題是,它只會更新我改變的第一個字符,所以如果我使用退格它會更新,然後我必須重新啓動,然後它會再次更新。 此外,它會走到組合框的最左邊,這可能是非常討厭.. 如果有人知道如何解決這個問題,我會非常感謝 – Nick 2010-09-20 12:13:51

+0

重新檢查,這是我的錯,我會重新檢查工作解決方案 – 2010-09-21 03:55:24

+0

回答更新。希望它有幫助。 – 2010-09-21 04:04:05

0

,如果你在代碼中創建隱藏和bind to that property的屬性是什麼?

第一次勝利是更好的可調試性,第二次勝利是您可以決定在獲取/設置數據時該怎麼做。

+0

對不起,我正在使用Visual Studio 2008 Express Edition,目前我還沒有其他任何東西。 所以,我不認爲我可以使用WPF? -sorry,對於所有這些我都有些新意,但我還沒有用C#編寫很多代碼。 – Nick 2010-09-20 11:36:34

+1

我使用的是Visual C#2008 Express Edition,我可以選擇File - > New Project - > WPF Application。大約6個月前,我開始了一個WPF項目,其中包含許多「someElement_Click」代碼和「Panel.Children」。添加(新的按鈕())「 - 代碼,但後來自學了一些[MVVM](http://msdn.microsoft.com/en-us/magazine/dd419663.aspx)。這是一個相當寬慰 - 不得不寫更多代碼在一些地方,但一切都變得相當結構化 – 2010-09-20 14:36:51

0

我只是有一個類似的問題:我的WinForms組合框,VB.Net,風格=下拉菜單,然後我想在編輯框中的變化而變化的實際列表項。

我也有多個組合框,我想有相同的行爲。

這裏是我如何適應上面的方法:

Public Class frmDocEntry 
    ... 
    Private lastIdx As Integer = -1 
    ... 
    Private Sub cbAnyMV_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbRGBStringMV.Enter, cbRGBIntegerMV.Enter, cbRGBFloatMV.Enter, cbRGBDateMV.Enter 
     ' comboBox.SelectedIndex will get *reset* to -1 by text edit 
     lastIdx = sender.SelectedIndex 
    End Sub 

    Private Sub cbAnyMV_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbRGBStringMV.Leave, cbRGBIntegerMV.Leave, cbRGBFloatMV.Leave, cbRGBDateMV.Leave 
     If lastIdx >= 0 Then 
      sender.Items(lastIdx) = sender.Text 
     End If 
     lastIdx = -1 
    End Sub 

    Private Sub cbAnyMV_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbRGBStringMV.SelectedIndexChanged, cbRGBIntegerMV.SelectedIndexChanged, cbRGBFloatMV.SelectedIndexChanged, cbRGBDateMV.SelectedIndexChanged 
     lastIdx = sender.SelectedIndex 
    End Sub