Principales respuestas
Introducir datos en Datagrid que ya tiene datos

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!
- Cambiado webJoseModerator lunes, 24 de noviembre de 2014 13:31
Respuestas
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
-
-
>>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 -
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
-
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
-
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!
-
>>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. 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.
- 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.
- Defina una lista a nivel de formulario para contener instancias de la clase creada en #1.
- Encapsule la lista de #2 dentro de un objeto BindingList.
- Asigne el objeto de #3 a la propiedad DataSource del DGV.
- 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