1

我正在学习 C#/Gtk#,通过加入并为我自己的个人享受/折磨而创建一个应用程序的怪物。我最近的困惑是如何从 ComboBoxEntry 中清除项目。我确实找到了一种方法,但对我来说似乎很笨拙。

这是我的测试应用程序,我使用文本创建 ComboBoxEntry,然后单击一个按钮将其清除:

初始应用程序负载

然后,当我单击按钮将其清除时,项目被删除,但“foo”仍保留为活动文本:

清除了组合的应用程序,但仍然有那个讨厌的 foo 在那里

无论如何,我想出了一种使用以下代码清除它的方法。似乎应该有更好的方法来做到这一点,但我找不到,所以我来这里进行完整性检查:

using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{   
    ListStore comboModel1 = new ListStore (typeof(string)); 

    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();

        ComboBoxEntry1.Model = comboModel1; 
        comboModel1.AppendValues ("foo");

        // Set "foo" as selected item
        Gtk.TreeIter iter;
        ComboBoxEntry1.Model.IterNthChild (out iter, 0);
        ComboBoxEntry1.SetActiveIter (iter);
    }

    protected void Button1OnClicked (object sender, System.EventArgs e)
    {
        // Just doing this  .Clear () still leaves "foo" as the ActiveText
        comboModel1.Clear ();

        // My kludge to clear ActiveText
        comboModel1.AppendValues ("");

        Gtk.TreeIter iter;
        ComboBoxEntry1.Model.IterNthChild (out iter, 0);
        ComboBoxEntry1.SetActiveIter (iter);

        comboModel1.Clear ();
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }
}

谢谢!杰森

4

1 回答 1

1

我刚刚在 MacOs 10.7 上对其进行了测试,一个简单的 comboModel1.Clear() 就可以了。没有 ActiveText,而且 Combobox 事件不再可访问,因为 ListStore 中没有值。所以也许这是Windows上的一个错误。但我对此表示怀疑,并将在 Windows 上进行测试。作为提示,您可以使用 GetIterFirst,而不是使用 IterNthChild。

于 2012-04-24T12:41:18.253 回答