NewK Posted May 29, 2012 at 05:11 PM Report #458966 Posted May 29, 2012 at 05:11 PM Boa tarde, antes de mais parabéns pelo fórum, sou extremamente recente aqui 🙂 venho-vos expor um problema, private void preencher_trees_geral(string nomeTabela, string ID, string parentId, string nome) { treeView1.Nodes.Clear(); treeView1.Tag = nomeTabela; string query = "SELECT " + ID + ", " + nome + ", " + parentId + " FROM " + nomeTabela + " WHERE (" + parentId + " IS NULL)"; var retParam = Correr_query(query); NpgsqlDataReader rdr = retParam.Item1; while (rdr.Read()) { TreeNode nodePai = new TreeNode(); nodePai.Tag = rdr[iD].ToString(); nodePai.Text = rdr[nome].ToString(); string id_pai = rdr[iD].ToString(); nodePai.Expand(); if (this.treeView1.InvokeRequired) { } treeView1.Nodes.Add(nodePai); Carregar_tree_filhos_geral(nodePai, nomeTabela, ID, parentId, nome, id_pai); } } public void Carregar_tree_filhos_geral(TreeNode nodepai, string nomeTabela, string ID, string parentId, string nome, string idPai) { string query = "SELECT " + ID + ", " + nome + ", " + parentId + " FROM " + nomeTabela + " WHERE (" + parentId + " = '" + idPai + "')"; var retParam = Correr_query(query); NpgsqlDataReader rdr = retParam.Item1; while (rdr.Read()) { TreeNode nodeFilho = new TreeNode(); nodeFilho.Tag = rdr[iD].ToString(); nodeFilho.Text = rdr[nome].ToString().Trim(); string temp = rdr[iD].ToString(); nodeFilho.Collapse(); nodepai.Nodes.Add(nodeFilho); Carregar_tree_filhos_geral(nodeFilho, nomeTabela, ID, parentId, nome, temp); } NpgsqlConnection con = retParam.Item2; con.Close(); } public Tuple<NpgsqlDataReader, NpgsqlConnection> Correr_query(String query) { NpgsqlConnection con = new NpgsqlConnection("Server=****;User Id=*****;" + "Password=*****;Database=*****;TimeOut=1000"); NpgsqlDataReader rdr = null; NpgsqlCommand cmd = null; con.Open(); cmd = new NpgsqlCommand(query, con); rdr = cmd.ExecuteReader(); Tuple<NpgsqlDataReader, NpgsqlConnection> retParam = new Tuple<NpgsqlDataReader, NpgsqlConnection>(rdr, con); return retParam; } O que se passa é o seguinte: eu quero preencher uma treeview com dados de uma base de dados. Utilizo uma função recursiva pois não sei qual será o numero de "pais" e nivel de filhos que cada pai tem, e por aí em diante. portanto tenho a função que preenche todos os pais ( em que o Parent_ID é NULL), e depois para cada pai vai preencher os filhos e para cada filhos preencher os filhos de uma maneira recursiva. Este código funciona na perfeição, mas como pode ser muito lento, devido ás operações para a base de dados, gostaria de correr estas funções no BackgroundWorker. Sei que tenho que fazer Invoke da treeview1 neste caso, mas não sei como proceder. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { preencher_trees_geral("nome.bd", "ID", "parent_ID", "nome"); } private void button4_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { } para já tenho isto mas como disse ele para na parte em que faz acçoes à treeview1. como faço o invoke da treeview1 para poder fazer addnode e o clear ? e já agora gostaria de saber se o uso do Tuple é o mais adequado para quando quero retornar dois objectos. cumprimentos Luís Martins Ps: espero não ter confundido muito mas é o meu primeiro post sobre programação 🙂
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now