Pregunta

Tengo algunos problemas con un elemento datagridview que estoy usando en VS2008. Este DataGridView es en realidad una pestaña en un elemento TabControl.

Le di 5 columnas que deben llenarse con elementos de un Objeto de disfraces que hice.

Es básicamente una pequeña aplicación de biblioteca que contiene una clase principal y varias clasificadas derivadas de ella. Todos tienen un método ToString () que representa los datos como una cadena de palabras clave que contienen los valores necesarios para que yo complete la vista de cuadrícula de datos.

Sin embargo, solo necesito los primeros 5, algunos objetos tendrán hasta 12 palabras clave. Actualmente, cada vez que agrego un objeto, la cuadrícula de datos no se llena sola, sino que agrega una cantidad de columnas igual a la cantidad de palabras clave que tiene el objeto específico.

Lo que estoy haciendo actualmente es esto:

public void libDataGrid_Click(object sender, EventArgs e)
        {
            if(this.manager.Lib.LibList[0] != null)
            {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
            }
        }

this.manager.Lib.LibList devuelve y ArrayList, en el que se almacenan todos los objetos. ArrayList puede contener elementos de todas las clases derivadas, pero como están todos conectados, la representación de cadena siempre contendrá los elementos que necesito para llenar la cuadrícula.

No veo cómo puedo filtrar solo los primeros cinco y hacer que se coloquen en las columnas correctas.

Y otra cosa. Actualmente solo puedo actualizar DataGridView haciendo clic en él. Debería activarse cuando cambio a cambiar a su pestaña específica en el control de Tab que quiero decir.

Intenté agregar un argumento para SelectedIndexChanged, pero eso no hace nada realmente ... O al menos, no parece hacer nada.

Lo que quiero decir es que comenté el código anterior y agregué esto en su lugar:

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
        }

Esto lo actualiza cada vez que se cambia la pestaña, sin importar a cuál. Tuve que eliminar la declaración if, ya que me dio una excepción. Probablemente porque la longitud de ArrayList no está establecida en la inicialización.

¿Fue útil?

Solución

Estoy un poco confundido por la pregunta, pero aquí hay algunos pensamientos:

  1. DataGridView tiene un <= > s propiedad; si no desea que cree sus propias columnas, configúrelo como falso
  2. Para enlazar a columnas existentes, el AutoGenerateColumn debe establecerse en cada
  3. DataPropertyName (en cmomon con cualquier control de lista que use TypeDescriptor) preferirá enormemente List<T> (para algunos T! = object) a ArrayList, ya que puede obtener metadatos incluso para Una lista vacía. En general, en 2.0 usar <=> es un error.

Otros consejos

Solo puedo dar una respuesta parcial, pero creo que la razón es que

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
        }

no funciona, es porque necesita agregar esta línea donde tabControl1 se está inicializando. He tenido este problema donde VS no lo hará por sí mismo.

tabControl1.SelectedIndexChanged += new EventHandler(tabControl1_SelectedIndexChanged);

Si entiendo su problema, parece similar a un problema con el que estaba luchando recientemente en este hilo en DataGridViews en C # /. NET2.0

Intenta llamar:

libDataGrid.Invalidate();

Esto debería obligar a Windows a volver a dibujar su control. No es necesario volver a conectar la fuente de datos y actualizar. (Creo que puedes comentar con seguridad esas 2 líneas).

También: ¿Cuál fue la excepción que estaba recibiendo?

¿Y usó el " Asistente de configuración de origen de datos " para ayudarte con el dataGridView?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top