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