2

Tengo un TreeView que carga con una función recursiva que la llamo desde el load_form

     private void CrearNodosPadre(int indicePadre, TreeNode nodePadre)
     {
         negociotreeview objc_treeview = new negociotreeview();              
         dataTableNodos = objc_treeview.RecogerDatos();

         DataView dataViewNodosHijos = new DataView(dataTableNodos);
        dataViewNodosHijos.RowFilter = dataTableNodos.Columns["IdPadre"].ColumnName + " = " + indicePadre;

        foreach (DataRowView dataFilas in dataViewNodosHijos)
        {
            TreeNode nuevoNodo = new TreeNode();

            nuevoNodo.Text = dataFilas["Codigo"].ToString().Trim() + "  " + dataFilas["Nombre"].ToString().Trim();
            nuevoNodo.Name = dataFilas["IdPCuentas"].ToString().Trim();
            nuevoNodo.Tag = dataViewNodosHijos.Table.Rows.IndexOf(dataFilas.Row);

            if (nodePadre == null)
            {
                treeView1.Nodes.Add(nuevoNodo);
            }
            else
            {
                nodePadre.Nodes.Add(nuevoNodo);
            }

            CrearNodosPadre(Int32.Parse(dataFilas["IdPCuentas"].ToString()), 
       nuevoNodo);
        }
    }

En la llamada dataTableNodos = objc_treeview.RecogerDatos(); llamo a mi

select * from treeview

el problema esta en que cuando agrego un nuevo nodo desde visual studio para guardarlo en mi base de datos y al seleccionarlo me aparece un error:

system.nullreferencexception: "Referencia a objeto no establecida como instancia de un objeto"
system.windows.form.treenode.tag.get devolvio null

en esta parte de mi código:

 public void MostrarNodosText(TreeNode nodeData)
    {
        DataTable dataTableNodos = new DataTable();
        dataTableNodos = objc_treeview.RecogerDatos();

        DataRow filasDatos;
        filasDatos = dataTableNodos.NewRow();

        filasDatos = dataTableNodos.Rows[int.Parse(nodeData.Tag.ToString())]; //aqui sale el error
        textBox1.Text = filasDatos["Codigo"].ToString();
        textBox2.Text = filasDatos["Nombre"].ToString();
        textBox3.Text = filasDatos["Cod_rapido"].ToString();       
    } 

y esa funcion la llamo a su vez en treeView1_AfterSelect

Si intento cargar de nuevo el Treeview se me repiten los datos, pero no se si eso resuelva el problema, alguna sugerencia?

Nathy
  • 426
  • 3
  • 9
  • 1
    Como mismo te indica el error, todo tiene que ver con la propiedad `Tag` .Revisa el valor que tiene `nodeData.Tag` es `null` o vacía, y cuando intenta hacer la conversión `int.Parse(nodeData.Tag.ToString())` se produce la excepción por ser null o vacío, Depura tu código, y revisa que valor trae la propiedad `Tag` – J. Rodríguez Dec 03 '19 at 15:30
  • yo creo que es porque al señalar el nodo no me lo esta leyendo desde la base de datos, si no de la propia vista en `visual studio`, porque vuelvo a ejecutar y señalo el mismo nodo que me causo la excepción y no pasa, como hago para que el `treeview` me vuelva a cargar desde la base de datos sin que se me repitan, me los muestra 2 veces, porque obvio llamo a la `función recursiva` 2 veces – Nathy Dec 03 '19 at 15:37
  • 1
    No, revisa la pregunta [¿Qué es una NullReferenceException y cómo solucionarla?](https://es.stackoverflow.com/a/76000/69447) que te ha mencionado @Pikoh, debes verificar porque en ese momento tu `Tag` es Null, debes estar segura que le has asignado un valor a esa propiedad, antes de enviar el nodo a la función, – J. Rodríguez Dec 03 '19 at 15:40
  • Gracias, pero sigo sin ver el error, si esta`null` es porque no está inicializado, no? – Nathy Dec 03 '19 at 16:11
  • Si, si esta Null es porque en ningún momento le has asignado valor a esa propiedad en tu código – J. Rodríguez Dec 03 '19 at 16:12
  • `nuevoNodo.Tag = dataViewNodosHijos.Table.Rows.IndexOf(dataFilas.Row);` pensé que me la podía agarrar de aquí desde la funcion `crearnodospadre` – Nathy Dec 03 '19 at 16:13
  • Has verificado que si toma valor en esa linea, depurando paso a paso has notado que IndexOf te esta devolviendo correctamente un valor numerico? – J. Rodríguez Dec 03 '19 at 16:18
  • disculpa mi ignorancia, pero como depuro esa linea para saber que valor me devuelve? – Nathy Dec 03 '19 at 16:21
  • Solo debes dar un click, en la linea que deseas depurar, en el lado lateral, izquiedo y te colocara la linea en rojo. Pero mira aqui un [video de youtube](https://youtu.be/NOWq6Lwdq1I) o cualquier otro vídeo, para que sepas siempre porque algo te causa error. – J. Rodríguez Dec 03 '19 at 16:26
  • Tienes razón, en mi función `crearnodospadres` esa linea me devuelve un null, como le asigno un valor de mi tabla? – Nathy Dec 03 '19 at 16:43
  • 1
    [Continuemos el debate en el chat](https://chat.stackexchange.com/rooms/101758/discussion-between-j-rodriguez-and-nathy). – J. Rodríguez Dec 03 '19 at 18:12

0 Answers0