valor vacia una manualmente lista filas fila datos como columnas agregar c# data-binding datagridview datasource currencymanager

c# - vacia - Agregar una fila después de configurar DataSource en Datagridview



agregar valor a datagridview c# (5)

Tenía muchas preguntas relacionadas con el enlace del origen de datos de la cuadrícula de datos. Tenía un DatagridView al que estoy configurando DataSource de una lista

List<Myclass> li = new List<MyClass>(); MyClass O = new MyClass(); O.Name = "Aden"; O.LastName = "B"; O.Id = 12; li.Add(O); O = new MyClass(); O.Name = "Li"; O.LastName = "S"; O.Id = 22; li.Add(O); Mydgv.DataSource = li;

Donde está MyClass

public Class MyClass { public string Name {get; set;} public string LastName {get; set;} public decimal Id {get; set;} }

Ahora quiero agregar una nueva fila a My DataGridView

DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone(); row.Cells[0].Value = "XYZ"; row.Cells[1].Value = 50.2; Mydgv.Rows.Add(row);

Pero no es posible que genere un error porque Datasource of Datagrid está Binded con List li . Entonces mi primera pregunta es ¿cómo podría hacer esto?

Mi segunda pregunta es: para hacer esto, hice una solución para alterar mi Lista li y Agregar una nueva fila de datos y luego establecerla en el origen de datos de la cuadrícula de datos, pero creo que no es una solución factible ¿hay alguna solución mejor?

Incluso intenté hacerlo por CurrencyManager

CurrencyManager currencyManager1 = (CurrencyManager)BindingContext[MyGrid.DataSource]; currencyManager1.SuspendBinding(); DataGridViewRow row = (DataGridViewRow)yourDataGridView.Rows[0].Clone(); row.Cells[0].Value = "XYZ"; row.Cells[1].Value = 50.2; Mydgv.Rows.Add(row); currencyManager1.ResumeBinding();

Como lo sé, suspendí el enlace de DataGrid para proporcionar formato a Grid, tal como lo hice en uno de mis mensajes, hacer que la fila visible sea falsa . Pero ¿por qué no funciona aquí al agregar una fila a la cuadrícula de datos?


Aquí está la solución para agregar filas a una fuente de datos después de que esté vinculada a DataGridView.

Tenga en cuenta que he utilizado un DataGridView en blanco "Mydgv" y el botón "button1" en el formulario.

También he usado la misma "MyClass" de su pregunta.

Ponga un botón llamado "button1" en el formulario y escriba este código

private void button1_Click(object sender, EventArgs e) { List<MyClass> li = (List<MyClass>)Mydgv.DataSource; MyClass O = new MyClass(); O.Name = "XYZ"; O.LastName = "G"; O.Id = new Random().Next(10, 100); li.Add(O); Mydgv.DataSource = li.ToList<MyClass>(); }

Haga clic en el botón y podrá ver que DataGridView se actualiza con la nueva fila.

En lugar de establecer el mismo objeto List como DataSource, pruebe una lista de MyClass como anoté a continuación.

Mydgv.DataSource = li.ToList <MyClass> ();

Para que sea más fácil de entender, pongo el Id como un número aleatorio entre 10 y 100.

Espero que lo verifique y me responda si hay algún problema con el código.


Sigue estos pasos ..

  1. Crear una propiedad de ObservableCollection de MyClass.

    private ObservableCollection<MyClass> _li; public ObservableCollection<MyClass> Li { get; set { _li = value; NotifyPropertyChangedEvent("Li"); } }

  2. Enlace DataGrid DataSource a la propiedad "Li" en el archivo XAML.

  3. Ahora, cada vez que se actualiza la colección (es decir, elementos agregados o eliminados), DataSource se actualizará automáticamente.


@Co. Aden

Según lo que veo, todo lo que hizo en la primera parte de enlazar la lista a la cuadrícula como fuente de datos está bien. Ejecute que se ha perdido para llamar al método de enlace de datos después de proporcionar el origen de datos.

Una vez que llame al método DataBind, los detalles se deben mostrar en la cuadrícula según lo que usted esperaba.

Mydgv.DataBind();

Muestra de referencia:

DO#:

public partial class home : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { List<Student> students = new List<Student>(); for (int i = 0; i < 10; i++) { students.Add(new Student(){FirstName = "First Name - " +i.ToString(),LastName = "Last Name - "+i.ToString()}); } students.Add(new Student() { FirstName = " ", LastName = " " }); UsingDataSourceAndDataBind(students); } private void UsingDataSourceAndDataBind(List<Student> students) { GridView1.DataSource = students; GridView1.DataBind(); } } class Student { public string FirstName { get; set; } public string LastName { get; set; } }

Código ASPX:

<body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> </div> </form>


crear global

List<Myclass> li = new List<MyClass>();

Fuera de la carga de página o cualquier función

Agregue / elimine cualquier fila de li dentro de cualquier función y llame a la línea siguiente cuando cambie los datos en li

gridview.DataSource=li; gridview.DataBind();


Intente usar una BindingList en lugar de List:

BindingList<MyClass> li = new BindingList<MyClass>();

Luego agrega o elimina registros de la lista en sí:

li.Add(new MyClass() { Id = 15, LastName = "Z", Name = "Agent" });

y la grilla mostrará automáticamente esa nueva fila.

Para que las actualizaciones de propiedades individuales aparezcan automáticamente en la cuadrícula, su clase necesita implementar la interfaz INotifyPropertyChanged:

public class MyClass : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }

y luego su propiedad tendría que plantear el evento:

private string lastName = string.Empty; public string LastName { get { return lastName; } set { if (value != lastName) { lastName = value; OnPropertyChanged("LastName"); } } }

Ahora, si actualiza una fila desde el código, la cuadrícula mostrará esa actualización:

li[1].LastName = "Q";

Consulte también Implementación de INotifyPropertyChanged: ¿existe una mejor manera?