none
Introducir datos en Datagrid que ya tiene datos RRS feed

  • Pregunta

  • Hola, tengo un problema con un datagrid.

    Primero introduzco un valor en la Row[0] pero luego llegaran más mensajes a parte que quiero que se vayan poniendo en la row[1], row[2], etc sucesivamente. El problema es que si no añado una Row dataGridView2.Rows.Add(), no me deja añadir más datos al datagrid, pero a su vez esto me crea una fila ENCIMA de la que ya tengo creada y no quiero eso, quiero que se añada debajo para poder seguir añadiendo datos debajo. El código es el siguiente:

    string[] trozos = msg.Split(',');
                    if (dataGridView2.Rows[0].Cells[0].Value == null)
                    {
                        dataGridView2.Rows[0].Cells[0].Value = "Has recibido una invitación de: " + trozos[1];
                    }
                    else
                    {
                        dataGridView2.Rows.Add();
                        dataGridView2.Rows[dataGridView2.RowCount-1].Cells[0].Value = "Has recibido una invitación de: " + trozos[1];
                    }               
    Gracias de antemano por la ayuda! Un saludo!

    sábado, 22 de noviembre de 2014 1:50

Respuestas

  • int n = dataGridView2.Rows.Add();
    dataGridView2.Rows[n].Cells[0].Value = "Has recibido una invitación de: " + trozos[1];
    


    G. Poliovei

    • Marcado como respuesta Maneeel93 lunes, 15 de diciembre de 2014 23:24
    sábado, 22 de noviembre de 2014 2:52

Todas las respuestas

  • Buenas noches,

    Porque no utilizas una lista  como ItemSource?

    Tendrias que definirlo como public, y luego tu codigo quedaria como el siguiente:

    Crear una lista

    List<string> trozos = new List<string>; 

    Agregar datos a una lista:

    trozos.Add(msg.Split(',');

    y al final lo pasas como ItemSource:

    dataGridView2.ItemsSource = trozos;


    Eduardo Ramirez MSP For Honduras

    sábado, 22 de noviembre de 2014 2:41
  • int n = dataGridView2.Rows.Add();
    dataGridView2.Rows[n].Cells[0].Value = "Has recibido una invitación de: " + trozos[1];
    


    G. Poliovei

    • Marcado como respuesta Maneeel93 lunes, 15 de diciembre de 2014 23:24
    sábado, 22 de noviembre de 2014 2:52
  • >>pero a su vez esto me crea una fila ENCIMA de la que ya tengo creada y no quiero eso, quiero que se añada debajo

    para poder controlar donde colocar la filapuedes usar el Insert() en lugar del Add()

    int index = dataGridView2.RowCount-1;
    
    DataGridViewRow row = new DataGridViewRow();
    
    row.Cells[0].Value = "...";
    
    dataGridView2.Rows.Insert(index, row);

    ------

    algo que noto es que quieres completar los campos pero usas

     if (dataGridView2.Rows[0].Cells[0].Value == null)

    con lo cual si la primer celda esta vacia creas una nueva, no deberias usar

    DataGridViewRow row = dataGridView2.Rows[0];
    
    int? col = null;
    
    foreach(DataGridViewColumn col in dataGridView2.Columns){
    
       if(row.Cells[col.Index].Value == null){
    
           col = col.Index;
    
           break;
    
       }
    
    }
    
    if(col.hasValue){
    
     row.Cells[col.Value].Value = "Has recibido una invitación de: " + trozos[1];
    
    } else {
    
        //aqui agregas la row
    
    }

    a donde voy es que debes determinar cual columna de la row actual es la que esta vacia para ponerle un dato, cuando todas tengas contenido recien alli creas una nueva row

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 22 de noviembre de 2014 12:01
  • Voy a probar todo lo que decís y luego comento como me han ido, gracias por la ayuda! 

    Por cierto, usando el código que os he pasado, lo de:

     if (dataGridView2.Rows[0].Cells[0].Value == null)

    es para añadir el primer valor en la primera celda

    Entonces uso lo de:

     else
                    {
                        dataGridView2.Rows.Add();
                        dataGridView2.Rows[dataGridView2.RowCount-1].Cells[0].Value = "Has recibido una invitación de: " + trozos[1];
                    }              

    para que si la primera está llena me añada una nueva fila debajo y introduzca el valor en ella, pero me la añade arriba y vacía.

    Pero como os digo, voy a probar vuestras soluciones a ver si me funcionan y os comento que tal.

    • Editado Maneeel93 sábado, 22 de noviembre de 2014 15:31
    sábado, 22 de noviembre de 2014 15:24
  • Buenas noches,

    Porque no utilizas una lista  como ItemSource?

    Tendrias que definirlo como public, y luego tu codigo quedaria como el siguiente:

    Crear una lista

    List<string> trozos = new List<string>; 

    Agregar datos a una lista:

    trozos.Add(msg.Split(',');

    y al final lo pasas como ItemSource:

    dataGridView2.ItemsSource = trozos;


    Eduardo Ramirez MSP For Honduras

    Primero de todo gracias. En cuanto a lo de código, el problema es que no me interesa crear una lista porque no la tendré que volver a usar. Tan solo quiero ir añadiendo datos 1 por 1 en el datagrid. Si luego usara la lista para otra cosa si que lo aprovecharía pero en este caso no me vale la pena crear una lista.
    sábado, 22 de noviembre de 2014 20:25
  • int n = dataGridView2.Rows.Add();
    dataGridView2.Rows[n].Cells[0].Value = "Has recibido una invitación de: " + trozos[1];


    G. Poliovei

    Hola, muchas gracias por la respuesta. La verdad es que para ser un código tan simple funciona genial, pero solo tiene un fallo, que me añade una fila de más siempre y esa fila queda en blanco y no consigo quitarla bien.

    Algo para quitarla sin que afecte a las demás filas? Un saludo!

    sábado, 22 de noviembre de 2014 20:31
  • >>pero a su vez esto me crea una fila ENCIMA de la que ya tengo creada y no quiero eso, quiero que se añada debajo

    para poder controlar donde colocar la filapuedes usar el Insert() en lugar del Add()

    int index = dataGridView2.RowCount-1;
    
    DataGridViewRow row = new DataGridViewRow();
    
    row.Cells[0].Value = "...";
    
    dataGridView2.Rows.Insert(index, row);

    ------

    algo que noto es que quieres completar los campos pero usas

     if (dataGridView2.Rows[0].Cells[0].Value == null)

    con lo cual si la primer celda esta vacia creas una nueva, no deberias usar

    DataGridViewRow row = dataGridView2.Rows[0];
    
    int? col = null;
    
    foreach(DataGridViewColumn col in dataGridView2.Columns){
    
       if(row.Cells[col.Index].Value == null){
    
           col = col.Index;
    
           break;
    
       }
    
    }
    
    if(col.hasValue){
    
     row.Cells[col.Value].Value = "Has recibido una invitación de: " + trozos[1];
    
    } else {
    
        //aqui agregas la row
    
    }

    a donde voy es que debes determinar cual columna de la row actual es la que esta vacia para ponerle un dato, cuando todas tengas contenido recien alli creas una nueva row

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Hola, gracias por la respuesta también. El problema es que lo veo demasiado complicado para lo que quiero hacer, lo he intentado pero no me está saliendo bien. Me interesa algo sencillo como lo que ha puesto el compañero George Poliovei, a ver si nos podrías ayudar con el problema que nos ha dado aunque seguiré intentando con tu código también y si consigo que me funcione lo comento.
    sábado, 22 de noviembre de 2014 20:35
  • Nadie sabe como arreglar eso?
    lunes, 24 de noviembre de 2014 11:45
  • Hola.  Veo que su dilema lo han tratado de resolver mediante programación directa sobre el DataGridView.

    En lo personal me gusta siempre manejar mis DGV enlazado a datos (Data Binding).  Es bien fácil.

    1. Defina una clase con propiedades que representen los datos que desea usted mostrar.  Actualmente parece ser que solamente desea mostrar una única columna con un mensaje informativo.
    2. Defina una lista a nivel de formulario para contener instancias de la clase creada en #1.
    3. Encapsule la lista de #2 dentro de un objeto BindingList.
    4. Asigne el objeto de #3 a la propiedad DataSource del DGV.
    5. Voilá!  Cada vez que necesite agregar un elemento, simplemente cree un nuevo objeto de la clase creada en #1 y agréguelo a la lista de #2.  Automáticamente se mostrará en el DGV.

    Ejemplo:

    //Esto es #1:
    public class MensajeUI
    {
        public string Mensaje { get; set; }
    }
    
    //#2:  Declare un List<MensajeUI> a nivel de formulario.
    private List<MensajeUI> _mensajes = new List<MensajeUI>();
    
    //#3 y #4:  En el Form_Load asigne el DataSource.
    private void Form_Load(object sender, EventArgs e)
    {
        ...
        datagridview2.DataSource = new BindingList<MensajeUI>(_mensajes);
    }
    
    //#5.  Cada vez que reciba un mensaje, agrégelo a _mensajes:
    MensajeUI msg = new MensajeUI() { Mensaje = "El nuevo mensaje" };
    _mensajes.Add(msg);  //Esta línea actualiza el DGV automáticamente.

    Fácil, ¿cierto?  Opcionalmente implemente INotifyPropertyChanged en la clase MensajeUI.  Alternativamente considere usar algo más que un DataGridView si lo único que desea es mostrar una única columna.  Un ListBox serviría bien.  Y sí, un ListBox puede usar Data Binding también.


    Jose R. MCP
    Code Samples

    lunes, 24 de noviembre de 2014 13:30
    Moderador