-1

私はgtk2perlでGUIアプリを書いています。ユーザーがチェックボックスをクリックすると、データベースの行を表示するテーブルがあります。そして、もう一度クリックすると、列の値が定義されている行を非表示にする必要があります。

私はこのコードを持っています:

# ListStore to stores model
my $list_store = Gtk2::ListStore->new(("Glib::String") x 3);

my $rows = &get_row($st); # arrayref on rows from a db

sub set_columns {
    my ($store, $rows) = @_;

    foreach my $row (@$rows) {
        my ($num, $name, $status) = @$row;
        $store->set($store->append,
            0 => $num,
            1 => $name,
            2 => $status,
        );
    }
}   # ----------  end of subroutine set_columns  ----------

...

sub show_columns {
    my ($names) = @_;                        # reference to @name_columns
    my $i = 0;                               # number of columns within ListStore
    foreach (@$names) {
        # TreeViewColumn is a column for TreeView
        my $col = Gtk2::TreeViewColumn->new;
        $col->set_title($_);
            $col->set_alignment(0.5);            # alignment of header
            $col->set_clickable(1);              # can click on header


        $tree_view->append_column($col);

        my $rend = Gtk2::CellRendererText->new;
        $col->pack_start($rend, TRUE);

        # Link column of TreeViewColumn's renderer to column of ListStore
        $col->add_attribute($rend, 'text', $i++);
    }
}

...

my @name_columns = qw(№ Name Status);

&set_columns($store, $rows);
&show_columns(\@name_columns);

そして、私はチェックボックスを持っています:

$ch->signal_connect(toggled => sub {
    my $self = shift;
    if ($self->get_active) {
        print "Yes\n";
                my $st = 'Good';       # status 
        &global_view($list_store, $st);  # function which call set and show_columns
    } else { 
        print "No\n";
                # TO-DO here!!!!!
    }
});

さて、ユーザーがチェックボックスをもう一度クリック(非アクティブ化)したときにユーザーからそれらを非表示にするために、TreeViewColumnから定義された$ st(ステータス)を持つ行を非表示にするにはどうすればよいですか?

4

1 に答える 1

0

私はこの問題を解決しました!私はこのコードを使用します:

sub remove_item {
    my ($st)= @_;
    my $it = $list_store->get_iter_first;
    while ($it) {
        if ($list_store->iter_is_valid($it) && $list_store->get($it, 3) eq $st) {
            my $tmp = $it;  # temporary iter for row delete
            print "Good\n";
            $it = $list_store->iter_next($it);
            $list_store->remove($tmp);
        } else {
            print "Bad\n";          
            $it = $list_store->iter_next($it);      
        }
    }   

}   # ----------  end of subroutine remove_item  ----------
于 2012-12-09T12:39:39.277 に答える