Jump to content

Preenchimento de TreeView recursivo com BackgroundWork


Recommended Posts

Posted

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 🙂

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.