Виджет GTK Sharp Refresh / Redraw

Я пытаюсь разработать действительно простой графический интерфейс с моно и GTK Sharp. У меня есть несколько двух выпадающих списков, и мне нужно изменить параметры, доступные во втором коде, на основе выбранного элемента из первого:

//Create window container
var mainContainer = new Table (3, 1, false);

//add form
var formContainer = new Table (1, 3, true);

//FIRST COMBOBOX
pdfSelect = new ComboBox(new string[] {"Monthly", "Monthly Offline", "Quarterly" }) { Active = 2 };
pdfSelect.Changed += new EventHandler(OnPdfSelectChanged);
formContainer.Attach (pdfSelect, 1, 2, 0, 1);

//MONTH COMBOBOX
monthSelect = new ComboBox(new string[] { "January","February","March","April","May","June","July","August","September","October","November","December" }){ Active = 0 };

formContainer.Attach(monthSelect, 2, 3, 0, 1);

mainContainer.Attach(formContainer, 0, 1, 0, 1);

win.Add(mainContainer);

Мое событие изменения ниже:

public static void OnPdfSelectChanged(object o, EventArgs args) {
    ComboBox combo = o as ComboBox;
    if (o == null) return;
    if (combo.ActiveText.Equals("Monthly") || combo.ActiveText.Equals("Monthly Offline"))
    {
        monthSelect = new ComboBox(new string[] { "January","February","March","April","May","June","July",
            "August","September","October","November","December" }) { Active = 0 };
    }
    else
    {
        monthSelect = new ComboBox(new string[] { "January", "April", "July", "October" }) { Active = 0 };
    }
    //TODO REFRESH WINDOW
}

Код работает, но второе поле со списком, похоже, не обновляется. Думаю, мне нужно обновить окно?

Спасибо


person Remo H. Jansen    schedule 13.02.2013    source источник


Ответы (3)


Проблема в том, что вы назначаете новую переменную Gtk.ComboBox переменной monthSelect, но это не удаляет автоматически старое поле со списком из окна и не добавляет новое. Что вы хотите, так это очистить содержимое поля со списком и добавить новый контент. Что-то типа:

monthSelect.Clear();
monthSelect.AppendText("January");
monthSelect.AppendText("April");
monthSelect.AppendText("July");
monthSelect.AppendText("October");
person fog    schedule 14.02.2013

Я заставил его работать, две подлые вещи - это вызвать Clear(), как сказал туман (+1), но после этого вам нужно назначить ячейке rendertext, иначе новые элементы не будут отображаться:

Метод Gtk.ComboBox.Clear "Отменяет все сопоставления на всех средствах визуализации для этого поле со списком."

public static void OnPdfSelectChanged(object o, EventArgs args) {
    ComboBox combo = o as ComboBox;
    if (o == null) return;
    //Set entries
    var entries = new string[] {  "January","February","March","April","May","June","July", "August","September","October","November","December" };
    if (combo.ActiveText.Equals("Quarterly"))
    {
        entries = new string[] { "January", "April", "July", "October" };
    }
    //clear previous data
    monthSelect.Clear();
    //cells data
    ListStore store = new ListStore(typeof(string));
    foreach (var item in entries) {
        store.AppendValues(item);
    }
    //assign data to combobox
    monthSelect.Model = store;
    //renderer for cells
    var cellRenderer = new CellRendererText();
    monthSelect.PackStart(cellRenderer, true);
    monthSelect.AddAttribute(cellRenderer, "text", 0);
    //set first item as active
    monthSelect.Active = 0;
}
person Remo H. Jansen    schedule 14.02.2013
comment
Если вы назначаете новую модель, вам даже не нужен Clear() (и, правильно, вам нужно предоставить хотя бы один модуль рендеринга ячеек). - person fog; 14.02.2013

Может быть, слишком поздно, но...

((ListStore)combobox.Model).Clear(); 
combobox.AppendText("item");
person tryparse    schedule 25.07.2013