none
2 Problemas con TreeView RRS feed

  • Pregunta

  • Hola expertos,

    Estoy intentando llenar un TreeView con tres niveles. He conseguido crear el nivel 0 (o padre) con el nombre de Cumpleaños,  colgar de él doce niveles 1 (o hijos), pero cuando intento colgar uno o más niveles 2 (o nietos) de cada nivel1, los nietos se me quedan también en el nivel 1. Ya he probado muchas de las posibilidades que he encontrado buscando información sobre el asunto, pero no he sabido arreglarlo. A continuación copio el código que estoy empleando para esta tarea.

    En otro TreeView diferente, tampoco he sabido cómo solucionar que muestre los iconos que he asignado a cada nivel: si al Nivel 0 le asigno una imagen de Carpeta, y al Nivel 1 una imagen de Documento, cuando se expande el árbol aparece la imagen de Carpeta para los dos niveles.

    Agradeceré que me digáis lo que hago mal para aprender algo más sobre este control.

    Friend Class ArbolDatos

        Private Nodo0 As New TreeNode("Cumpleaños")

        Private Nodo1 As New TreeNode("Meses")

        Private Nodo2 As New TreeNode("Nombres")

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _

                                Handles Me.Load

            TreePruebas.Nodes.Clear()

            CargaMes()

        End Sub

        Private Sub CargaMes()

            Dim iForMes As Integer = 0

            For iForMes = 1 To 12

                Nodo0.Nodes.Add(MonthName(iForMes))

                CargaNombre(iForMes, Nodo0)

            Next

            TreePruebas.Nodes.Add(Nodo0)

        End Sub

        Private Sub CargaNombre(ByVal NoMes As Integer, ByVal NodoHijo As TreeNode)

            Dim TextoDia As String, TextoNodo As String

            dbSelec = "SELECT Cumples.* FROM Cumples WHERE Mes=@NoMes ORDER BY Mes, Dia"

            dbComando = Conectar.CreateCommand()

            dbComParam = New OleDbParameter("@NoMes", OleDbType.Integer)

            dbComParam.Value = NoMes

            dbComando.Parameters.Add(dbComParam)

            dbComando.CommandText = dbSelec

            dbAdapter = New OleDbDataAdapter(dbComando)

            dbTabla = New DataTable

            dbAdapter.Fill(dbTabla)

            Conectar.Close()

            For Each dbDataRow As DataRow In dbTabla.Rows

                TextoDia = dbDataRow.Item("Dia").ToString

                If TextoDia.Length = 1 Then 'Pone blancos para alinear día

                    TextoDia = Blancos(dbDataRow.Item("Dia").ToString, 4)

                End If

                TextoNodo = TextoDia & " - " & dbDataRow.Item("Nombre").ToString

                NodoHijo.Nodes.Add(New TreeNode(TextoNodo))

            Next

        End Sub

    • Cambiado Enrique M. Montejo sábado, 6 de diciembre de 2014 17:01 Pregunta relacionada con controles de Windows Forms.
    miércoles, 3 de diciembre de 2014 13:54

Todas las respuestas

  •             Que tal amigo te paso un ejemplo...

            private void frmMenuPrincipal_Load(object sender, EventArgs e)
            {
             CargarMenu();
             }
    
    private void CargarMenu()
            {
                lblUsuario.Text = "Usuario : " + Sistemas.Usuario.ToUpper();
                lblVersion.Text = Funciones.VersionSitema();
                //lblVersion.Text = "Version actual = " + Convert.ToString(Assembly.GetExecutingAssembly().GetName().Version);
                //lblVersion.Text = "Version actual = " + Funciones.GetPublishedVersion();
                CargarMenuDelPadre(0, null);
            }
    
      private void CargarMenuDelPadre(int IndicePadre, ToolStripMenuItem MenuPadre)
            {
                var MenuViewHijos = new DataView(Sistemas.DataSetMenu.Tables["Menu"]);
                MenuViewHijos.RowFilter = Sistemas.DataSetMenu.Tables["Menu"].Columns["id_padre"].ColumnName + " = " + IndicePadre;
                // Agregar al Menu los Hijos que se han obtenido en el DataView.
                foreach (DataRowView dataRowCurrent in MenuViewHijos)
                {
                    var MenuItem = new ToolStripMenuItem();
                    MenuItem.Name = dataRowCurrent["id_control"].ToString();
                    MenuItem.AccessibleName = dataRowCurrent["id_padre"].ToString();
                    MenuItem.Text = dataRowCurrent["nombre_menu"].ToString();
                    MenuItem.Click += new EventHandler(MenuItemSeleccionado);
                    if (MenuPadre == null)
                    {
                        MenuPrincipal.Items.Add(MenuItem);
                    }
                    else
                    {
                        if (MenuItem.ToString() == "-")
                        {
                            MenuPadre.DropDownItems.Add(new ToolStripSeparator());
                        }
                        else
                        {
                            MenuPadre.DropDownItems.Add(MenuItem);
                        }
                    }
                    // Llamada recurrente al mismo método para agregar los Hijos del menu recién agregado.                               
                    CargarMenuDelPadre(Convert.ToInt32(dataRowCurrent["id_control"]), MenuItem);
                    MenuPrincipal.ForeColor = Color.Navy;
                    MenuItem.ForeColor = Color.Navy;
                    MenuPrincipal.Dock = DockStyle.Top;
                    MainMenuStrip = MenuPrincipal;
                    Controls.Add(MenuPrincipal);
                    IsMdiContainer = true;
                }
            }
    
      //Abre el formulario de acuerdo al item del menu seleccionado
            private void MenuItemSeleccionado(object sender, EventArgs e)
            {
                var FiltrarDatos = new DataView(Sistemas.DataSetMenu.Tables["Menu"]);
                var SelectedMenuName = Convert.ToInt32(((ToolStripMenuItem)sender).Name);
                //Verifica si el formulario es de UnidadNegocioSucursal
               
                    FiltrarDatos.RowFilter = Sistemas.DataSetMenu.Tables["Menu"].Columns["id_control"].ColumnName + " =" +
                                             SelectedMenuName;
                    string frm = FiltrarDatos[0]["nombre"].ToString();
    
                    if (FiltrarDatos.Count > 0 && frm != "")
                    {
                        int idControl = Convert.ToInt32(FiltrarDatos[0]["id_control"]);
    
                        OpenForm("iCorp." + frm, idControl);
                    }           
            }
    
      //Abre el formulario
            public void OpenForm(String NombreForm, int idControl)
            {          
                    Assembly asm = Assembly.GetEntryAssembly();
                    Type formtype = asm.GetType(NombreForm);
    
                    //verificamos si es un tipo valido
                    if (formtype != null)
                    {
                        //para todos los formularios comunes que no heredan de FrmBase
                        if (formtype.BaseType == typeof(Form))
                        {
                            var Formulario = (Form)Activator.CreateInstance(formtype);
                            if (FormularioAbieto(Formulario.Name, Formulario.CompanyName))
                            {
                                return;
                            }
                            else
                            {
                                Formulario.MdiParent = this;
                                Formulario.StartPosition = FormStartPosition.CenterScreen;
                                Formulario.MinimizeBox = true;
                                Formulario.Show();
                            }
                        }
                   }
            }     
    

    OBS: Favor vota si te es útil la información.

    Saludos 

    BEMO- Paraguay 

    https://tcsystems.wordpress.com/


    miércoles, 3 de diciembre de 2014 16:54
  • Hola Julio Cesar,

    Tal vez no me he explicado bien. Los nombre de los meses se añaden donde yo quiero, y son los nombres los que deberían colgar de cada mes los que no cuelgan del mes. Quizá se mejor que lo veas en la imagen que adjunto.

    Gracias por responder

    miércoles, 3 de diciembre de 2014 17:55
  • Hola bader0907

    Te agradezco la respuesta, pero no entiendo lo que me envías (¿puede que sea C#?). Yo estoy trabajando en VB.net, y quizá te ayude a entender mi primer problema la imagen que adjunto.

    Saludos 

    miércoles, 3 de diciembre de 2014 18:00
  • Julio César,

    Te ruego mil disculpas: lo que me enviabas funciona justo como quería. Lo que ha ocurrido es que en vez de hacer un sencillo "Copia/Pega" lo escribí a mano y de memoria, y al no hacerlo bien no corría.

    ¿Me puedes decir algo respecto al asunto de las imágenes? Si no fuera el caso, dímelo para marcar como respuesta y cerrar el hilo.

    Muchas gracias.

    miércoles, 3 de diciembre de 2014 19:10