Джаджа GTK Sharp Refresh / Redraw

Опитвам се да разработя наистина прост GUI с моно и 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), но след това трябва да присвоите текст за рендиране на клетка или новите елементи няма да се показват:

Gtk.ComboBox.Clear Method "Отменя всички съпоставяния на всички програми за изобразяване за това разгъващ се списък."

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