ITfjernundervisning

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 Sub

Og 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 Sub

Klassisk 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.