Grid en Mono

14 views
Skip to first unread message

francisco prieto

unread,
Nov 8, 2013, 2:09:52 PM11/8/13
to mono-hispano
Chicos,

Es posible usar un NodeView para hacer carga de datos?

La idea es tener 2 columnas...

En la primera pongo las variables que deben ser seteadas
En la segunda quiero que el usuario pueda poder cambiar los valores...

Es posible esto o hay que utilizar otro control?

Gracias,

Pancho
Cordoba
Argentina

francisco prieto

unread,
Nov 10, 2013, 4:08:00 PM11/10/13
to mono-hispano
Bueno chicos me respondo y dejo un codigo de ejemplo con el cual he logrado hacerlo.

using System;
using System.Collections;
using Gtk;

public class ValParam
{
    public ValParam (string parametro,string valor)
    {
        this.Parametro = parametro;
        this.Valor = valor;
    }
    public string Parametro;
    public string Valor;
}
public partial class MainWindow: Gtk.Window
{   
    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();
        CargarParametros ();
    }

    ArrayList misParametros;

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

    void CargarParametros ()
    {
        misParametros = new ArrayList ();
        misParametros.Add (new ValParam ("color", "rojo"));
        misParametros.Add (new ValParam ("sabor", "dulce"));
        misParametros.Add (new ValParam ("textura", "suave"));

        TreeViewColumn colParam = new TreeViewColumn ();
        colParam.Title = "Parametro";
        CellRendererText celdaParam = new CellRendererText ();
        colParam.PackStart (celdaParam, true);

        TreeViewColumn colValor = new TreeViewColumn ();
        colValor.Title = "Valor";
        CellRendererText celdaValor = new CellRendererText ();
        celdaValor.Editable = true;
        celdaValor.Edited += ValorIngresado;
        colValor.PackStart (celdaValor, true);

        ListStore lstValores = new ListStore (typeof(ValParam));
        foreach (ValParam registro in misParametros) {
            lstValores.AppendValues (registro);
        }

        colParam.SetCellDataFunc (celdaParam, new TreeCellDataFunc (RenderParametro));
        colValor.SetCellDataFunc (celdaValor, new TreeCellDataFunc (RenderValor));


        nodParametros.Model = lstValores;

        nodParametros.AppendColumn (colParam);
        nodParametros.AppendColumn (colValor);

        nodParametros.EnableGridLines = TreeViewGridLines.Vertical;
    }

    void RenderParametro (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter)
    {
        ValParam registro = (ValParam)tree_model.GetValue (iter, 0);
        if (registro.Parametro.StartsWith ("c") == true) {
            (cell as Gtk.CellRendererText).Foreground="red";
        } else {
            (cell as Gtk.CellRendererText).Foreground="darkgreen";
        }
        (cell as Gtk.CellRendererText).Text = registro.Parametro;
    }

    void RenderValor (TreeViewColumn tree_column, CellRenderer cell, TreeModel tree_model, TreeIter iter)
    {
        ValParam registro = (ValParam)tree_model.GetValue (iter, 0);
        (cell as Gtk.CellRendererText).Text = registro.Valor;
    }

    private void ValorIngresado (object o, EditedArgs args)
    {
        Gtk.TreeIter iter;
        nodParametros.Model.GetIter(out iter, new TreePath (args.Path));

        ValParam registro = (ValParam)nodParametros.Model.GetValue (iter, 0);
        registro.Valor = args.NewText;
    }

    protected void ClickEnviar (object sender, EventArgs e)
    {
        throw new NotImplementedException ();
    }
}

Use como documentacion de respaldo el siguiente link

http://www.mono-project.com/GtkSharp_TreeView_Tutorial

Aunque si revisan mi ejemplo notaran que en el metodo ValorIngresado me refiero al tree utilizando la propiedad Model y no directamente como hace la gente de Mono.

Saludos,

Pancho
Cordoba
Argentina
Reply all
Reply to author
Forward
0 new messages