【问题标题】:C#: Real-time combobox updatingC#:实时组合框更新
【发布时间】:2011-04-14 15:20:57
【问题描述】:

我一直在尝试将文本文件加载到组合框中,然后制作一个按钮以将我在组合框中所做的任何更改保存回文本文件。

问题是,当我在组合框中输入内容时,选定的“项目”没有得到更新。我可以更改句子,但只要我单击“保存”按钮,它也会更新组合框,它会回到我编辑它之前。

另外,当我编辑组合框并单击下拉箭头时,它会显示文本文件的内容,再次没有我编辑的句子。

我一直在寻找一段时间,但到目前为止似乎没有人知道如何去做。 :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; 
    } 

} 

【问题讨论】:

  • 当你用一个小的后续问题“编辑”问题时,不要重写整个问题,否则以前的答案没有意义,新来的人不知道你在说什么。只需将您的编辑附加到原始问题的末尾即可。

标签: c# combobox


【解决方案1】:

ComboBox.Update 方法只是重绘组合框区域。 据我了解,您想在运行时更改组合框选定项。在这种情况下,您可能想要使用 TextUpdate 事件。 Combobox 选中的索引是自动停止编辑的。所以还有另一种方法。跟踪价值变化。这是一个代码sn-p:

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

【讨论】:

  • 你是最棒的!该代码终于可以工作了!我现在遇到的唯一问题是它只会更新我更改的第一个字符。因此,如果我在任何地方使用退格键,它就会更新,然后我必须重新启动它才能再次更新。此外,它会转到组合框线的最左侧,这可能很烦人。如果有人也知道如何解决这个问题,我将非常感激。
【解决方案2】:

如果您在代码隐藏和bind to that property 中创建属性会怎样?

第一个胜利是更好的可调试性,第二个胜利是您可以决定在获取/设置数据时要做什么。

【讨论】:

  • 很抱歉,我使用的是 Visual Studio 2008 Express Edition,目前无法访问任何其他内容。所以,我不认为我可以使用 WPF? -对不起,我对这一切有点陌生,我还没有用 C# 编写过很多代码。
  • 我正在使用 Visual C# 2008 Express Edition,我可以选择文件 -> 新建项目 -> WPF 应用程序。大约 6 个月前,我在 WPF 中开始了一个项目,其中包含大量“someElement_Click”代码和“Panel.Children.Add(new Button())”代码,但后来自学了一些 MVVM。这真是一种解脱——不得不在某些地方编写更多代码,但一切都变得井井有条。
【解决方案3】:

我刚刚遇到了类似的问题:我有 Winforms 组合框、VB.Net、Style=DropDown,我想在编辑框中进行更改以更改实际的列表项。

我也有多个组合框,我希望它们具有相同的行为。

我是这样调整上述方法的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多