Mi è capitato oggi per un lavoro di dover creare un datagrid cui si possa aggiungere dinamicamente delle righe, pare una cosa banale però mi ci è andata via qualche oretta e ho dovuto fare un po' di workaround, ma alla fine ce l'ho fatta..
Sicuramente la cosa era fattibile in modo più elegante, e magari c'era qualche scoriciatoia a me sconosciuta, ma ormai l'ho risolta così.
Posto un esempio composto di una pagina aspx e codebehind, un dataset tipizzato e una classe che deriva dal dataset e ne gestisce l'inserimento della nuova riga..
Se vi capita provatelo e ditemi pure se vi pare una solenne m*****a!
---------------------------------------------------------------------------------------------------------------
START CODE
---------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
Default.aspx
---------------------------------------------------------------------------------------------------------------
<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="DataGridNewRow.Default" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>DataGridNewRow</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="
http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body>
<h2>Add New Row To Datagrid</h2>
<a href="
http://blogs.dotnethell.it/gabbagabbanet/" target="_blank">http://blogs.dotnethell.it/gabbagabbanet/</a>
<hr>
<form id="Form1" method="post" runat="server">
<asp:datagrid id="dgAnagrafica" runat="server" Width="100%" AutoGenerateColumns="False"
BorderWidth="1px" CellSpacing="1" CellPadding="2" ShowFooter="True" OnItemDataBound="dgAnagrafica_ItemDataBound" style="font-name:verdana;font-size:13px;border:1px solid #000000;" >
<AlternatingItemStyle BackColor=#f1efe2></AlternatingItemStyle>
<Columns>
<asp:TemplateColumn HeaderText="Nome">
<ItemTemplate>
<asp:Label Runat="server" ID="lbl_Nome" Text='<%#DataBinder.Eval(Container.DataItem,"Nome")%>'>
</asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox style="width:100px;" Runat="server" ID="txtNome"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Cognome">
<ItemTemplate>
<asp:Label Runat="server" ID="lbl_Cognome" Text='<%#DataBinder.Eval(Container.DataItem,"Cognome")%>' >
</asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox style="width:100px;" Runat="server" ID="txtCognome"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Indirizzo">
<ItemTemplate>
<asp:Label Runat="server" ID="lbl_Indirizzo" Text='<%#DataBinder.Eval(Container.DataItem,"Indirizzo")%>' >
</asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox style="width:100px;" Runat="server" ID="txtIndirizzo"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Data di nascita">
<ItemTemplate>
<asp:Label Runat="server" ID="lbl_DataNascita" Text='<%#DataBinder.Eval(Container.DataItem,"DataNascita")%>' >
</asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox style="width:100px;" Runat="server" ID="txtDataNascita"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Telefono">
<ItemTemplate>
<asp:Label Runat="server" ID="lbl_Telefono" Text='<%#DataBinder.Eval(Container.DataItem,"Telefono")%>' >
</asp:Label>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox style="width:100px;" Runat="server" ID="txtTelefono"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="">
<ItemTemplate>
<asp:Button style="width:100px;" Runat="server" ID="btDelete" Text="Delete" OnClick="btDelete_Click"></asp:Button>
</ItemTemplate>
<FooterTemplate>
<asp:Button style="width:100px;" Runat="server" ID="btAdd" Text="Add" OnClick="btAdd_Click"></asp:Button>
</FooterTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>
</form>
</body>
</HTML>
---------------------------------------------------------------------------------------------------------------
Default.aspx.cs
---------------------------------------------------------------------------------------------------------------
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace DataGridNewRow
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class Default : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid dgAnagrafica;
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
AnagraficaHandler objAnagrafica = new AnagraficaHandler();
dgAnagrafica.DataSource=objAnagrafica.Tables[0].DefaultView;
dgAnagrafica.DataBind();
}
}
protected void btAdd_Click(object sender, EventArgs e)
{
DataGridItem dgFooter = (DataGridItem)dgAnagrafica.Controls[0].Controls[dgAnagrafica.Items.Count+1];
AnagraficaHandler objAnagrafica ;
if (Session["DsAnagrafica"]!=null)
{
objAnagrafica = (AnagraficaHandler)Session["DsAnagrafica"];
}
else
{
objAnagrafica = new AnagraficaHandler();
}
objAnagrafica.Nome=((TextBox)dgFooter.Cells[0].FindControl("txtNome")).Text;
objAnagrafica.Cognome= ((TextBox)dgFooter.Cells[2].FindControl("txtCognome")).Text;
objAnagrafica.Indirizzo =((TextBox)dgFooter.Cells[3].FindControl("txtIndirizzo")).Text ;
try
{
objAnagrafica.DataNascita=Convert.ToDateTime( ((TextBox)dgFooter.Cells[1].FindControl("txtDataNascita")).Text );
}
catch{
objAnagrafica.DataNascita = DateTime.MinValue;
}
objAnagrafica.Telefono=((TextBox)dgFooter.Cells[4].FindControl("txtTelefono")).Text;
objAnagrafica.InsertNewRow();
dgAnagrafica.DataSource=objAnagrafica.Tables[0].DefaultView;
dgAnagrafica.DataBind();
Session["DsAnagrafica"]=objAnagrafica;
}
protected void dgAnagrafica_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if (e.Item.ItemType==ListItemType.Item || e.Item.ItemType==ListItemType.AlternatingItem)
{
for(int i=0;i<dgAnagrafica.Columns.Count;i++)
{
if (i==3)
{
try
{
DateTime dt;
string shortdate;
dt = Convert.ToDateTime(((Label)e.Item.Cells[i].Controls[1]).Text);
if (dt!=DateTime.MinValue)
{
shortdate = dt.ToShortDateString();
}
else
{
shortdate = string.Empty;
}
((Label)e.Item.Cells[i].Controls[1]).Text = shortdate;
}
catch
{}
}
}
}
}
protected void btDelete_Click(object sender, System.EventArgs e)
{
AnagraficaHandler objAnagrafica = (AnagraficaHandler)Session["DsAnagrafica"];
objAnagrafica.Tables[0].Rows[((DataGridItem)((System.Web.UI.WebControls.Button)(sender)).Parent.Parent).DataSetIndex].Delete();
dgAnagrafica.DataSource = objAnagrafica.Tables[0].DefaultView;
dgAnagrafica.DataBind();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}---------------------------------------------------------------------------------------------------------------
AnagraficaHandler.cs
---------------------------------------------------------------------------------------------------------------
using System;
namespace DataGridNewRow
{
/// <summary>
/// Summary description for AnagraficaHandler.
/// </summary>
public class AnagraficaHandler : AnagraficaDataSet
{
public AnagraficaHandler()
{
//
// TODO: Add constructor logic here
//
}
private string m_Nome;
public string Nome
{
get
{
return m_Nome;
}
set
{
m_Nome=value;
}
}
private string m_Cognome;
public string Cognome
{
get
{
return m_Cognome;
}
set
{
m_Cognome=value;
}
}
private string m_Indirizzo;
public string Indirizzo
{
get
{
return m_Indirizzo;
}
set
{
m_Indirizzo=value;
}
}
private DateTime m_DataNascita;
public DateTime DataNascita
{
get
{
return m_DataNascita;
}
set
{
m_DataNascita=value;
}
}
private string m_Telefono;
public string Telefono
{
get
{
return m_Telefono;
}
set
{
m_Telefono=value;
}
}
public void InsertNewRow()
{
AnagraficaDSRow dsRow = (AnagraficaDSRow)this.Tables[0].NewRow();
dsRow.Nome=this.Nome;
dsRow.Cognome=this.Cognome;
dsRow.Indirizzo=this.Indirizzo;
dsRow.DataNascita=this.DataNascita;
dsRow.Telefono=this.Telefono;
this.Tables[0].Rows.Add(dsRow);
}
}
}---------------------------------------------------------------------------------------------------------------
AnagraficaDataSet.XSD
---------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="AnagraficaDataSet" targetNamespace="
http://tempuri.org/AnagraficaDataSet.xsd"
elementFormDefault="qualified" attributeFormDefault="qualified" xmlns="
http://tempuri.org/AnagraficaDataSet.xsd"
xmlns:mstns="
http://tempuri.org/AnagraficaDataSet.xsd" xmlns:xs="
http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="AnagraficaDataSet" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="AnagraficaDS">
<xs:complexType>
<xs:sequence>
<xs:element name="Nome" type="xs:string" minOccurs="0" />
<xs:element name="Cognome" type="xs:string" minOccurs="0" />
<xs:element name="Indirizzo" type="xs:string" minOccurs="0" />
<xs:element name="DataNascita" type="xs:date" minOccurs="0" />
<xs:element name="Telefono" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
---------------------------------------------------------------------------------------------------------------
END CODE
---------------------------------------------------------------------------------------------------------------