0

私がやろうとしているのは、いくつかの列を持つ TreeView です。最初の列は ComboBox です。つまり、Gtk.CellRendererCombo を使用しています。問題は、ComboBox から値を選択したときに、セルのテキストを "" から選択した値に変更したいということです。Gtk.CellRendererCombo.Edited イベントで、列の Text フィールドを EditedArgs.NewText に設定すると実現可能です。

問題は、値を設定するたびに新しい行を作成し、テキスト フィールドを Gtk.CellRendererText のように動作させたいのですが、そうではありません。その列の行ごとに異なる値ではなく、Gtk.CellRendererCombo.Text で設定された値と同じです。

Gtk.CellRenderer には状態が含まれていてはならないので、Text フィールドを使用することは、私がやろうとしていることから考えると非常に悪い考えです。

しかし、TreeView のモデルである Gtk.ListStore から値を設定した場合 (Gtk.CellRendererCombo のモデルとは異なります)。設定された値は、ComboBox の列には表示されません。

class Program
{
    private static Gtk.TreeView treeview = null;

    static void OnEdited(object sender, Gtk.EditedArgs args)
    {
        Gtk.TreeSelection selection = treeview.Selection;
        Gtk.TreeIter iter;
        selection.GetSelected(out iter);

        treeview.Model.SetValue(iter, 0, args.NewText); // the CellRendererCombo
        treeview.Model.SetValue(iter, 1, args.NewText); // the CellRendererText

        //(sender as Gtk.CellRendererCombo).Text = args.NewText; // Will set all the Cells of this Column to the Selection's Text
    }

    static void Main(string[] args)
    {
        Gtk.Application.Init();

        Gtk.Window window = new Window("TreeView ComboTest");
        window.WidthRequest = 200;
        window.HeightRequest = 150;

        Gtk.ListStore treeModel = new ListStore(typeof(string), typeof(string));
        treeview = new TreeView(treeModel);

        // Values to be chosen in the ComboBox
        Gtk.ListStore comboModel = new ListStore(typeof(string));
        Gtk.ComboBox comboBox = new ComboBox(comboModel);
        comboBox.AppendText("<Please select>");
        comboBox.AppendText("A");
        comboBox.AppendText("B");
        comboBox.AppendText("C");
        comboBox.Active = 0;

        Gtk.TreeViewColumn comboCol = new TreeViewColumn();
        Gtk.CellRendererCombo comboCell = new CellRendererCombo();
        comboCol.Title = "Combo Column";
        comboCol.PackStart(comboCell, true);
        comboCell.Editable = true;
        comboCell.Edited += OnEdited;
        comboCell.TextColumn = 0;
        comboCell.Text = comboBox.ActiveText;
        comboCell.Model = comboModel;
        comboCell.WidthChars = 20;

        Gtk.TreeViewColumn valueCol = new TreeViewColumn();
        Gtk.CellRendererText valueCell = new CellRendererText();
        valueCol.Title = "Value";
        valueCol.PackStart(valueCell, true);
        valueCol.AddAttribute(valueCell, "text", 1);

        treeview.AppendColumn(comboCol);
        treeview.AppendColumn(valueCol);

        // Append the values used for the tests
        treeModel.AppendValues("comboBox1", string.Empty); // the string value setted for the first column does not appear.
        treeModel.AppendValues("comboBox2", string.Empty);
        treeModel.AppendValues("comboBox3", string.Empty);

        window.Add(treeview);
        window.ShowAll();
        Gtk.Application.Run();
    }
}

値を表示するために選択が行われた ComboBox のセルが必要ですが、後で変更するために引き続き編集可能です。

誰かがこれを行う方法を持っている場合、私はあなたの入力に非常に感謝しています. ありがとう。

アップデート:

私が思うに、Gtk.CellRendererCombo は Gtk.CellRendererText を継承しているため、セルに設定された値を無視するだけです。ここで、Gtk.CellRendererCombo から継承するカスタム MyCellRendererCombo を作成し、レンダリングに提供されたときにセルに設定された値を使用できると思いますが、Gtk.CellRendererText と Gtk.CellRendererCombo の違いに関するドキュメントは非常にスリムです...詳細を知るには、C での実装にアクセスする必要があると思います。

4

1 に答える 1

0

OK、問題の解決策を見つけました。「テキスト」値を読み取る「非表示」列を使用します。非表示の列には Gtk.CellRendererText が含まれており、Gtk.CellRendererCombo には新しい列との属性マッピングが必要です。

結果のコードは次のとおりです。

class Program
{
    private static Gtk.TreeView treeview = null;

    static void OnEdited(object sender, Gtk.EditedArgs args)
    {
        Gtk.TreeSelection selection = treeview.Selection;
        Gtk.TreeIter iter;
        selection.GetSelected(out iter);

        treeview.Model.SetValue(iter, 1, args.NewText); // the CellRendererText
    }

    static void Main(string[] args)
    {
        Gtk.Application.Init();

        Gtk.Window window = new Window("TreeView ComboTest");
        window.WidthRequest = 200;
        window.HeightRequest = 150;

        Gtk.ListStore treeModel = new ListStore(typeof(string), typeof(string));
        treeview = new TreeView(treeModel);

        // Values to be chosen in the ComboBox
        Gtk.ListStore comboModel = new ListStore(typeof(string));
        Gtk.ComboBox comboBox = new ComboBox(comboModel);
        comboBox.AppendText("<Please select>");
        comboBox.AppendText("A");
        comboBox.AppendText("B");
        comboBox.AppendText("C");
        comboBox.Active = 0;

        Gtk.TreeViewColumn comboCol = new TreeViewColumn();
        Gtk.CellRendererCombo comboCell = new CellRendererCombo();
        comboCol.Title = "Combo Column";
        comboCol.PackStart(comboCell, true);
        comboCol.AddAttribute(comboCell, "text", 1);
        comboCell.Editable = true;
        comboCell.Edited += OnEdited;
        comboCell.TextColumn = 0;
        comboCell.Text = comboBox.ActiveText;
        comboCell.Model = comboModel;
        comboCell.WidthChars = 20;

        Gtk.TreeViewColumn valueCol = new TreeViewColumn();
        Gtk.CellRendererText valueCell = new CellRendererText();
        valueCol.Title = "Value";
        valueCol.PackStart(valueCell, true);
        valueCol.AddAttribute(valueCell, "text", 1);
        valueCol.Visible = false;

        treeview.AppendColumn(comboCol);
        treeview.AppendColumn(valueCol);

        // Append the values used for the tests
        treeModel.AppendValues("comboBox1", "<Please select>"); // the string value setted for the first column does not appear.
        treeModel.AppendValues("comboBox2", "<Please select>");
        treeModel.AppendValues("comboBox3", "<Please select>");

        window.Add(treeview);
        window.ShowAll();
        Gtk.Application.Run();
    }
}
于 2012-12-05T04:34:47.127 に答える