ASP.NET / Dataset og datagrid objektet / Ret post
Ret post i datasettet
Det minder meget om de foregående:
- Vi skal indstille vores datagrid - dvs. tilføje Edit, Update, Cancel kolonnen og fortælle hvilken kolonne, der er primærkolonne.
- Vi skal sætte kommandoer på
- Vi skal skrive koden (der er så 3 routiner til edit, update og cancel)
Forståelse af datagrid og datasæt sammenhængen
På dette tidspunkt bliver det rigtig vigtigt at forstå sammenhængen mellem et datagrid og et datasæt. Du skal tænke dig datasættet som tabellerne i en database - det er faktisk også en ram-baseret repræsentation af en relationel database. Dit datagrid er en visning af informationerne i tabellerne i datasættet.
MEN MEN MEN der er INGEN kobling mellem tabellerne i datasættet og indholdet i dit datagrid! (det kommer vist i næste version af .NET framework'et)
- OG det giver lidt udfordring når brugeren i denne lektion skal ændre informationerne først i dit datagrid og efterfølgende skal du sørge for at informationerne kommer ned i datasættet (og derfra videre ned i XML dokumentet).
Objekt kodning (C#)
I vores klasse skal vi have skrevet en metode, der returnerer et enkelt projekt og en opdaterings metode:
public DataRow Projekt(int ID)
{
DataRow []objRows;
string strSelect = "ID='" + ID.ToString() + "'";
objRows = _Projekter.Tables[0].Select(strSelect);
return objRows[0];
}
public void Opdater()
{
_Projekter.WriteXml(ConfigurationSettings.AppSettings["XMLPath"] + @"\projekter.xml");
}Og i codebehind skal vi have skrevet 3 eventhandlere
private void dgridProjekter_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
dgridProjekter.EditItemIndex = e.Item.ItemIndex;
DoDataBind();
}
private void dgridProjekter_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataRow Projekt = _Projekter.Projekt(Convert.ToInt16(dgridProjekter.DataKeys[e.Item.ItemIndex]));
Projekt["Navn"] = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
Projekt["Kunde"] = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
_Projekter.Opdater();
dgridProjekter.EditItemIndex = -1;
DoDataBind();
}
private void dgridProjekter_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
dgridProjekter.EditItemIndex = -1;
DoDataBind();
}Objekt kodning (VB)
I vores klasse skal vi have skrevet en metode, der returnerer et enkelt projekt og en opdaterings metode:
public Function Projekt(ByVal ID As String) As DataRow
Dim objRows() As DataRow
Dim strSelect As String = "ID='" + ID.ToString() + "'"
objRows = _Projekter.Tables(0).Select(strSelect)
return objRows(0)
End Function
public Sub Opdater()
_Projekter.WriteXml(ConfigurationSettings.AppSettings("XMLPath") + "\projekter.xml")
End SubOg i codebehind skal vi have skrevet 3 eventhandlere
private Sub dgridProjekter_EditCommand(ByVal...
dgridProjekter.EditItemIndex = e.Item.ItemIndex
DoDataBind()
End Sub
private Sub dgridProjekter_UpdateCommand(ByVal ...
Dim Projekt as DataRow = _Projekter.Projekt(Convert.ToInt16(dgridProjekter.DataKeys(e.Item.ItemIndex)))
Projekt("Navn") = CType(e.Item.Cells(1).Controls(0), TextBox).Text
Projekt("Kunde") = CType(e.Item.Cells(2).Controls(0), TextBox).Text
_Projekter.Opdater()
dgridProjekter.EditItemIndex = -1
DoDataBind()
End Sub
private Sub dgridProjekter_CancelCommand(ByVal ...
dgridProjekter.EditItemIndex = -1
DoDataBind()
End SubKlassisk kodning
VB.NET
Private Sub dgridAndeby_CancelCommand(ByVal ...
dgridAndeby.EditItemIndex = -1
DoDatabind()
End Sub
Private Sub dgridAndeby_EditCommand(ByVal ...
dgridAndeby.EditItemIndex = e.Item.ItemIndex
DoDatabind()
End Sub
Private Sub dgridAndeby_UpdateCommand(ByVal ...
Dim objRows() As DataRow
Dim dsetAndeby As New DataSet
Dim strSelect As String
strSelect = "ID='" + CStr(dgridAndeby.DataKeys(e.Item.ItemIndex)) + "'"
dsetAndeby = GetDataset()
objRows = dsetAndeby.Tables(0).Select(strSelect)
objRows(0).Item("Fornavn") = CType(e.Item.Cells(1).Controls(0), TextBox).Text
dsetAndeby.WriteXml(Server.MapPath("Andeby.xml"))
dgridAndeby.EditItemIndex = -1
DoDatabind()
End Sub
Som man kan se, er der dukket en ny funktion op, der hedder GetDataset() og det afføder også en lille ændring i DoDatabind():
Private Function GetDataset() As DataSet
Dim dsetAndeby As New DataSet
dsetAndeby.ReadXml(Server.MapPath("Andeby.xml"))
Return dsetAndeby
End Function
Private Sub DoDatabind()
Dim objDataView As DataView
objDataView = GetDataset().Tables(0).DefaultView
dgridAndeby.DataSource = objDataView
dgridAndeby.DataBind()
End Sub
C#
private void CancelEdit(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
dgridAndeby.EditItemIndex = -1;
DoDatabind();
}
private void DoEdit(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
dgridAndeby.EditItemIndex = e.Item.ItemIndex;
DoDatabind();
}
private void UpdateEdit(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
DataRow []objRows;
DataSet dsetAndeby = DataSet();
dsetAndeby = GetDataset();
String strSelect = "ID='" + (string)dgridAndeby.DataKeys[e.Item.ItemIndex] + "'";
objRows = dsetAndeby.Tables[0].Select(strSelect);
objRows[0]["Fornavn"] = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
dsetAndeby.WriteXml(Server.MapPath("Andeby.xml"));
dgridAndeby.EditItemIndex = -1;
DoDatabind();
}
Som man kan se, er der dukket en ny funktion op, der hedder GetDataset() og det afføder også en lille ændring i DoDatabind():
private DataSet GetDataset()
{
DataSet dsetAndeby = new DataSet();
dsetAndeby.ReadXml(Server.MapPath("Andeby.xml"));
return dsetAndeby;
}
private void DoDatabind()
{
DataView objDataView;
objDataView = GetDataset().Tables[0].DefaultView;
dgridAndeby.DataSource = objDataView;
dgridAndeby.DataBind();
}
Bemærk, at Item objektet har en FindControl metode, man kan bruge i stedet for at skulle indeksere sig igennem cellerne - den virker bare bedst på template kolonner, som vi skal se på om lidt.
Når du har betalt for kurset får du adgang til øvelser til hver lektion.
Og når du har fået godkendt din besvarelse får du desuden adgang til mine løsningsforslag med ekstra tips og trix.