You might want to check out one of my projects - Gtk3::Ex::DBI.

Example constructor:

    $self->{param} = Gtk3::Ex::DBI::Datasheet->new(
    {
        dbh                 => $self->{globals}->{connections}->{CONTROL}
      , sql                 => {
                                  select        => "TEMPLATE_NAME,
PARAM_NAME, PARAM_DESC, PARAM_DEFAULT"
                                , from          => "param"
                                , order_by      => "PARAM_NAME"
                               }
      , force_upper_case_fields => 1
      , primary_keys            => [ "TEMPLATE_NAME", "PARAM_NAME" ]
      #, dont_update_keys        => 1
      , auto_incrementing       => 0
      , fields                  => [
            {
                name            => "TEMPLATE_NAME"
              , renderer        => "hidden"
              , dont_update     => 1
            }
          , {
                name            => "PARAM_NAME"
              , x_percent       => 30
            }
          , {
                name            => "PARAM_DESC"
              , x_percent       => 40
            }
          , {
                name            => "PARAM_DEFAULT"
              , x_percent       => 30
            }
        ]
      , vbox                    => $self->{builder}->get_object( "param" )
      , recordset_tools_box     => $self->{builder}->get_object(
"PARAM_recordset_tools" )
      , before_insert           => sub { $self->before_param_insert }
      , on_insert               => sub { $self->on_param_insert }
    } );

Here's a screenshot of what the above code produces ( it's from an ETL
framework I'm hopefully open-sourcing soon ):
http://tesla.duckdns.org/downloads/param.jpg

The 'vbox' is a Gtk3::Box in your glade window where a datasheet will
be created.
The 'recordset_tools_box' is a Gtk3::Box where a set of buttons will
be created - apply, insert, delete, undo.

In this example, I'm injecting primary keys in because they're not
defined in the database ( data warehouse appliance that doesn't
enforce keys ), but if you have PKs defined in the database, they're
detected and used.

I seriously need to update my website / docs, but for now, install
from cpan and give it a spin, and let me know if you have any
questions.

Dan

On Tue, Nov 22, 2016 at 12:35 PM, David Lowrence <debmin...@gmail.com> wrote:
> I'm writing a program in gtk3-perl and am experiencing a problem with a
> TreeView that does not display a second load of data after a clear().  FWIW,
> I'm doing a customer search, and this sub is run if there are multiple
> results from a search on a name.
>
>  I am including the code below where this happens..  I'm using xml generated
> by glade and loading it with GtkBuilder.  Notice that I'm using clear()
> before the first display, on an empty ListStore, and the first pass displays
> correctly.  If I do a subsequent search, the dialog shows with the header
> for the TreeView, but nothing is shown.  If I eliminate the clear(), then
> the data from the previous search is shown (as expected), with the result of
> the second search appended, but when clear() is executed, the data is blank.
>
> I've used the same procedure with Gtk2 in another program, and it worked,
> and, in fact, I edited this file to use Gtk2, and edited the .glade file
> until it didn't produce errors on load and this worked.  I even rewrote the
> program in C, and it works as expected.  Admittedly, when I experimented
> with Gtk2, I simply deleted properties and things in the glade file and the
> output was not correct, bu6 I don't believe I eliminated anything that would
> have corrected the problem.
>
> Of course AFAIK, there is no documentation as of yet for Gtk3-Perl, and I
> could be using some incorrect code, but I truly feel that there's a bug in
> the Gtk3 code that is doing this.
>
> I've been a bit longwinded, but, to summarize, when $dlg is run the first
> time, the tree view displays the data, but on a second pass, after dlear()
> ing, nothing (except for the column headers) is shown.
>
> The database engine I'm using is DBI with DBD::Pg (postgresql)
>
> sub select_cust_from_ids {
>     my $ids = shift;    # A list of ID's to search for in the database
>
> #   'dlg_customer_view_multi' is a dialog defined in the glade file.  it is
> a dialog
> #    containing a treeview with its ListStore Model and its columns defined
> also in
> #    the glade file.
>     my $dlg = $builder->get_object ('dlg_customer_view_multi');
>     my $view = $builder->get_object ('treeview_customer_data');
>
>     # First build a list of placeholders for the query
>     my @placeholders;
>
>     foreach (@$ids) {
>         push @placeholders, 'cust_id = ?';
>     }
>
>     my $qry = qq/SELECT lastname,firstname,coalesce(mi,''),streetaddr,/ .
>     qq/city,state,zip,cust_id FROM poolsalesfullview WHERE / .
>     join (' OR ', @placeholders);
>
>     my $custs = $dbh->selectall_arrayref ($qry, undef, @$ids);
>    unless ($custs) {
>         my $msg = 'No data was retrieved...';
>
>         if ($dbh->err) {
>             $msg .= "\n" . $dbh->errstr;
>         }
>
>         my $d = Gtk3::MessageDialog->new ($w_main, 'destroy-with-parent',
>             'notice', 'gtk-ok', $msg);
>         $d->run;
>         $d->destroy;
>         return;
>     }
>
>     my $m = $view->get_model;
>     $m->clear;
>
>     foreach my $row (@$custs) {
>         my $iter = $view->get_model->append();
>
>         unless ($view->get_model->iter_is_valid($iter)) {
>             my $d = MessageDialog->new ($dlg, 'destroy-with-parent',
> :                'warning', 'gtk-close',
>                 'Invalid iter for TreeView');
>             return;
>         }
>
>         my (@cols, @vals);
>         my @parms = ($iter);
>
>         for (my $x = 0; $x < scalar (@$row); $x++) {
>             #push(@cols, $x); push (@vals, $row->[$x]);
>             push (@parms, $x => $row->[$x]);
>         }
>
>         #$view->get_model->set ($iter, \@cols, \@vals);
>         $view->get_model->set(@parms);
>     }
>
> #     ------ Testing ------
> #    this displays the correct data in the second pass
> #    so it appears that the Liststore itself is being populated correctly
> #    it seems that somehow, the treeview is losing its relation to the Model
> #    when the ListStore is clear()-ed when data is in it.
>
> #    my $it = $view->get_model->get_iter_first;
> #
> #    while ($it) {
> #        my ($l,$f);
> #        $l = $view->get_model->get_value($it, 0);
> #        $f = $view->get_model->get_value($it, 1);
> #        print "$f $l\n";
> #
> #        unless ($view->get_model->iter_next($it)) {
> #            $it = undef;
> #        }
> #    } print "\n";
> #     ------ Testing ------
>
>     $dlg->run;
>     $dlg->hide;
> }
>
>
>
>
> _______________________________________________
> gtk-perl-list mailing list
> gtk-perl-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/gtk-perl-list
>
_______________________________________________
gtk-perl-list mailing list
gtk-perl-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-perl-list

Reply via email to