none
lleno un DataGridView mediante DataSource pero no me actuliza la informacion de las columnas RRS feed

  • Pregunta

  •         private DataGridView dataGridView1 = new DataGridView();
            private BindingSource bindingSource1 = new BindingSource();
    ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
                this.dataGridView1.AllowUserToAddRows = false;
                this.dataGridView1.AllowUserToResizeColumns = false;
                this.dataGridView1.AllowUserToResizeRows = false;
                this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
                this.dataGridView1.BackgroundColor = System.Drawing.SystemColors.Control;
                this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                this.dataGridView1.ColumnHeadersVisible = false;
                this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Top;
                this.dataGridView1.Location = new System.Drawing.Point(0, 0);
                this.dataGridView1.MultiSelect = false;
                this.dataGridView1.Name = "dataGridView1";
                this.dataGridView1.RowHeadersVisible = false;
                this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
                this.dataGridView1.Size = new System.Drawing.Size(617, 239);
                this.dataGridView1.TabIndex = 0;
                this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick);
                this.dataGridView1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.dataGridView1_KeyDown);
                
                this.dataGridView1.ColumnHeadersVisible = false;
                this.dataGridView1.AutoGenerateColumns = true;
                bindingSource1.DataSource = filtros;
                this.dataGridView1.DataSource = null;
                this.dataGridView1.DataSource = bindingSource1;
                this.dataGridView1.Invalidate();
                bindingSource1.ResetBindings(true);
                this.dataGridView1.Refresh();
                foreach (DataGridViewColumn col in dataGridView1.Columns)
                {
                    col.Visible = false;
                }
                this.dataGridView1.Columns["awTitulos"].Visible = true;
                this.dataGridView1.ReadOnly = true;
                this.dataGridView1.Rows[0].Cells[2].Selected = true;
                #endregion
    
                this.dataGridView1.Focus();
                this.dataGridView1.Select();

    en el foreach no ve las columnas, el List tiene Count=0

    y en las lineas siguientes da error pues no hay Rows ni Columns

    evidentemente alguna linea me sobra o me falta


    Hugo González (Macgyber)

    martes, 26 de noviembre de 2019 21:12

Todas las respuestas

  • evidentemente alguna linea me sobra o me falta

    Desde luego, algo tiene que faltar. Si solo existen esas líneas, no puede funcionar.

    Por una parte, el dataGridView se inicializa con un "new", pero en ningún momento se hace un Add a la colección de controles de ningún contenedor. Eso hace que solo exista en memoria, no es visible en pantalla. Cuando esto ocurre, no funciona el visible=true en ninguna de sus columnas, no es posible hacerlas visibles.

    Pero también ocurre que se carga desde un BindingSource y el BindingSource lo único que tiene es un DataSource que se conecta a una variable que has llamado "filtros". Si no te trae ningún dato, casi seguro que el problema está en ese "filtros". Ahí es donde se tiene que devolver un BindingList con toda la información. Si no devuelve lo datos adecuados, el dataGridView no recibirá nada..


    miércoles, 27 de noviembre de 2019 7:28
    Moderador
  • public class ADatoFiltros
        {
            public string awTabla1 { get; set; }
            public string awAtributo1 { get; set; }
            public int nwLargoAtributo { get; set; }
            public int nwDecimalesAtributo { get; set; }
            public string awTitulos { get; set; }
            public string awPicture { get; set; }
            public ControlFiltro awTipo { get; set; }
            public string awTabla2 { get; set; }
            public string awAtributo2 { get; set; }
            public int nwLargoAtributo2 { get; set; }
            public int nwDecimalesAtributo2 { get; set; }
            public string awTitulo2 { get; set; }
            public string awExplicacion { get; set; }
            public bool lwFiltroInverso { get; set; } // false filtro directo, true filtro inverso
    
            public ADatoFiltros()
            {
            }
        }

    La variable filtros es un List<ADatoFiltros>, que segun lo que he buscado esta entre lo que se le puede ingresar a un DataSource

    Ahora le ingrese las columnas mediante este codigo:

    DataGridViewTextBoxColumn column1 = new DataGridViewTextBoxColumn(); column1.Name = "awAtributo1"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "awTabla1"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "nwLargoAtributo"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "nwDecimalesAtributo"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "awTitulos"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "awPicture"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "awTipo"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "awTabla2"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "awAtributo2"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "nwLargoAtributo2"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "nwDecimalesAtributo2"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "awTitulo2"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "awExplicacion"; dataGridView1.Columns.Add(column1); column1 = new DataGridViewTextBoxColumn(); column1.Name = "lwFiltroInverso"; dataGridView1.Columns.Add(column1); bindingSource1.DataSource = utiles.List2DataTable(filtros);

    Tambien he transformado el List<ADatoFiltros> en un DataTable mediante un metodo : utiles.List2DataTable()

    Con esto ahora me aparecen las 14 columnas, que antes no aparecian.

    Pero ahora las Rows estan vacias, y me da error en la linea:

     this.dataGridView1.Rows[0].Cells[2].Selected = true;

    Se me ocurre que alguna propiedad del datagrid esta mal seteada e impide que se llenen las Rows, pero no me doy cuenta de cual puede ser.


    Hugo González (Macgyber)

    miércoles, 27 de noviembre de 2019 11:12
  • Por los síntomas que describes tiene más bien pinta de que el List<ADatoFiltros> llega vacío, lo cual indicaría algún error en el proceso que lo carga de datos. Ejecuta el programa con el debugger y síguelo paso a paso en la parte donde se carga, y después el paso al datatable, y después el paso del datatable al sitio donde lo "bindeas", para verificar cuál es el punto exacto en el que te quedas sin datos.

    miércoles, 27 de noviembre de 2019 12:49
    Moderador
  • Siempre llega con 7 Rows y 14 Columns

    Reviso los Datasource y ambos estan llenos, en el BindingSource y en el DataGridView

    Pero en dataGridView1.Rows nunca hay nada


    Hugo González (Macgyber)

    miércoles, 27 de noviembre de 2019 13:51
  • Reviso los Datasource y ambos estan llenos

    ¿Cómo que "ambos"? Se supone que solo estábamos hablando de uno.

    [...] y en el DataGridView Pero en dataGridView1.Rows nunca hay nada

    Vuelve a pasar lo mismo. Se supone que solo estábamos hablando de un DataGridview cuya instancia se llama dataGridView1. ¿Cómo es eso de que hay datos "en el DataGridView" pero no los hay "en el dataGridView1"? ¿Estás llenando uno y esperando que aparezcan los datos en otro distinto? Algo no queda claro aquí.

    miércoles, 27 de noviembre de 2019 15:17
    Moderador
  • Segun lo que encontre en la web tengo que llenar el bindingSource1.DataSource y luego con este relleno el dataGridView1.DataSource

    he probado de las 2 formas

    tambien encontre que antes de cargar el dataGridView1.DataSource hay que ponerle null


    Hugo González (Macgyber)

    miércoles, 27 de noviembre de 2019 15:34
  • Segun lo que encontre en la web tengo que llenar el bindingSource1.DataSource y luego con este relleno el dataGridView1.DataSource

    No necesariamente. También puedes asignar directamente al DataSource un DataTable o un List<clase>, sin necesidad de interponer el BindingSource. Pero en ambos casos seguiría sin funcionar en caso de que el objeto asignado no contenga datos. Por eso es importante lo de usar el debugger para localizar el unto exacto en el que se produce el uso de la variable que no tiene datos, cuando al principio sí que los tenía. Hay que localizar donde se pierden, y para esto es importantísima la ejecución paso-a-paso con el debugger.

    tambien encontre que antes de cargar el dataGridView1.DataSource hay que ponerle null

    No es forzoso. Lo de asignar null se hace cuando el datagridview estaba mostrando determinados datos y quieres "limpiarlo" para más tarde mostrar otra cosa. Si partimos de cero, puedes perfectamente asignarle directamente el origen de datos sin antes poner null. Pero en cualquier caso, esto no tiene nada que ver ni sirve para arreglar nada en caso de que el objeto que asignamos al origen de datos se encuentre vacío de datos.

    miércoles, 27 de noviembre de 2019 20:03
    Moderador
  • Cuando explicaba que los datos existen al momento de asignarlos al DataSource, me referia a que lo debuggee y vi los datos paso a paso, mismo cuando me esta dando el error puedo ver que la variable filtros tiene 7 filas de 14 columnas.

    Se supone que al llenar el DataSource no es necesario rellenar los Columns ni los Rows !!!

    Se supone que se puede rellenar con List<clase> o con DataTable, probe con ambos.

    Probe llenar el DataSource del dataGridView1 y el DataSource del bindingSource1 y con este el del dataGridView1, pero si no defini previamente las Columns no se rellenan ni estas ni las Rows.

    Si defino las Columns, evidentemente puedo trabajar con ellas y el error se produce cuando voy a trabajar con las Rows.

    He probado comentando la linea que refiere a las Rows para que no de errror (en esta linea solo selecciono la primer linea del datagridview) pero el formulario se muestra sin el datagridview ???

    Me faltaba explicar que todo esto lo tengo en el load del formulario ???


    Hugo González (Macgyber)

    miércoles, 27 de noviembre de 2019 20:40
  • Me faltaba explicar que todo esto lo tengo en el load del formulario ???

    Existe un "bug" conocido por el que hay ciertos casos en los que si se produce una excepción en el Load del formulario, no te presenta el error ni se detecta de ninguna manera, sino que sigue ejecutando como si no hubiese pasado nada. Convendría verificar que no te esté pasando uno de estos casos. Prueba a mover o copiar provisionalmente el código a otro sitio que no sea el Load y probarlo desde ahí. Si arroja algún error, lo arreglas y una vez arreglado lo vuelves a poner en el Load.

    Por otra parte, si al depurarlo compruebas que está llena de datos la variable que pones en el DataSource del datagridview (¡justo en ese momento, no vale con examinar la variable en otro punto!), entonces con toda seguridad te tiene que agregar las columnas (si tienes el AutoGenerateColumns a True)) y presentar los datos. Si no o hace, la siguiente sospecha es que tengas dos datagridviews y estés asignando el DataSource a uno que no sea el mismo que se ve en pantalla (recuerda que en el código mostrado solo se ve que le haces el "new" pero no se ve que se agregue a la colección de controles -- me imagino que esto es una omisión al copiar y pegar en el mensaje del foro, pero si realmente el código está así no es de extrañar que no funcione).

    jueves, 28 de noviembre de 2019 7:03
    Moderador