none
Comment faire une Mise à jour de données avec un formview uniquement en code behind RRS feed

  • Discussion générale

  • J'ai crée un EditItemTemplate sur une page .aspx avec <%# Bind("MonChamp") %> qui fonctionne correctement. Et maintenant comment coder la même chose sur une page .aspx.vb uniquement?

    Voici une page pour  tester les deux modes de fonctionnement:

    L'exemple ci dessous ne fait pas la mise à jour en code behind!

    Code:

    Partial Public Class WForm
      Inherits System.Web.UI.Page
    
      Private Sub WForm_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        Dim _Par As Parameter
        SqlDataSource1.ConnectionString = "server=localhost;port=3306;user id=test; password=test; database=test; pooling=false"
        SqlDataSource1.ProviderName = "MySql.Data.MySqlClient"
        SqlDataSource1.SelectCommand = "SELECT ID,FirstName FROM test"
        SqlDataSource1.UpdateCommand = "UPDATE test SET FirstName = @FirstName WHERE (ID = @original_ID)"
        SqlDataSource1.UpdateCommandType = SqlDataSourceCommandType.Text
        SqlDataSource1.OldValuesParameterFormatString = "original_{0}"
        SqlDataSource1.ConflictDetection = ConflictOptions.OverwriteChanges
    
        _Par = New Parameter("FirstName", DbType.String)
        _Par.Direction = ParameterDirection.InputOutput
        SqlDataSource1.UpdateParameters.Add(_Par)
        _Par = New Parameter("ID", DbType.Int32)
        _Par.Direction = ParameterDirection.InputOutput
        SqlDataSource1.UpdateParameters.Add(_Par)
    
        FormView2.DataKeyNames = New String("ID").Split(";")
        FormView2.ItemTemplate = New myTemplate()
        FormView2.EditItemTemplate = New myEditTemplate()
    
      End Sub
      Public Sub OnItemUpdating1(ByVal sender As Object, ByVal e As FormViewUpdateEventArgs)
        Dim _label As Label = New Label
        _label.Text = "View1 new:" + e.NewValues.Count.ToString + " old:" + e.OldValues.Count.ToString
        Page.Controls.Add(_label)
      End Sub
      Public Sub OnItemUpdating(ByVal sender As Object, ByVal e As FormViewUpdateEventArgs)
        Dim _label As Label = New Label
        _label.Text = "View2 new:" + e.NewValues.Count.ToString + " old:" + e.OldValues.Count.ToString
        Page.Controls.Add(_label)
      End Sub
    
      Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        AddHandler FormView2.ItemUpdating, AddressOf OnItemUpdating
        AddHandler FormView1.ItemUpdating, AddressOf OnItemUpdating1
    
      End Sub
    End Class
    
    Public Class myEditTemplate
      Implements ITemplate
      Sub New()
      End Sub
      Sub InstantiateIn(ByVal container As Control) Implements ITemplate.InstantiateIn
        Dim _Text As TextBox = New TextBox
        _Text.ID = "TextBox_2"
        AddHandler _Text.DataBinding, AddressOf Text_DataBinding
        container.Controls.Add(_Text)
        Dim _Btn1 As Button = New Button
        _Btn1.ID = "Button_2"
        _Btn1.Text = "Update"
        _Btn1.CommandName = "Update"
        container.Controls.Add(_Btn1)
        Dim _Btn2 As Button = New Button
        _Btn2.ID = "Button_3"
        _Btn2.Text = "Cancel"
        _Btn2.CommandName = "Cancel"
        container.Controls.Add(_Btn2)
      End Sub
      Private Sub Text_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
        Dim Control As TextBox = CType(sender, TextBox)
        If TypeOf (Control.NamingContainer) Is FormView Then
          Dim formViewContainer As FormView = CType(Control.NamingContainer, FormView)
          Dim rowView As DataRowView = CType(formViewContainer.DataItem, DataRowView)
          Control.Text = DataBinder.Eval(rowView, "FirstName").ToString()
        End If
      End Sub
    End Class
    Public Class myTemplate
      Implements ITemplate
      Sub New()
      End Sub
      Sub InstantiateIn(ByVal container As Control) Implements ITemplate.InstantiateIn
        Dim _Text As TextBox = New TextBox
        _Text.ID = "TextBox_1"
        AddHandler _Text.DataBinding, AddressOf Text_DataBinding
        container.Controls.Add(_Text)
        Dim _Btn1 As Button = New Button
        _Btn1.ID = "Button_1"
        _Btn1.Text = "Edit"
        _Btn1.CommandName = "Edit"
        container.Controls.Add(_Btn1)
      End Sub
      Private Sub Text_DataBinding(ByVal sender As Object, ByVal e As EventArgs)
        Dim Control As TextBox = CType(sender, TextBox)
        If TypeOf (Control.NamingContainer) Is FormView Then
          Dim formViewContainer As FormView = CType(Control.NamingContainer, FormView)
          Dim rowView As DataRowView = CType(formViewContainer.DataItem, DataRowView)
          Control.Text = DataBinder.Eval(rowView, "FirstName").ToString()
        End If
      End Sub
    End Class
    

    <%@ Page Language="vb" AutoEventWireup="false" Inherits="WebApplication1.WForm" CodeBehind="WForm.aspx.vb" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server"> </head> <body> <form id="form1" runat="server"> Test1<br /> <asp:FormView ID="FormView1" runat="server" DataSourceID="SqlDataSource1" DataKeyNames="ID"> <ItemTemplate> <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("FirstName") %>'></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="Edit" CommandName="Edit" /> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("FirstName") %>'></asp:TextBox> <asp:Button ID="Button2" runat="server" Text="Update" CommandName="Update"/> <asp:Button ID="Button3" runat="server" Text="Cancel" CommandName="Cancel"/> </EditItemTemplate> </asp:FormView> Test2 Templates in code behind<br /> <asp:FormView ID="FormView2" runat="server" DataSourceID="SqlDataSource1"> </asp:FormView> <asp:SqlDataSource ID="SqlDataSource1" runat="server"></asp:SqlDataSource> </form> </body> </html>
    Merci pour votre aide.

    mardi 1 juin 2010 19:38

Toutes les réponses

  • Bonjour,

    Pour récupérer les contrôles contenus dans votre FormView, il faut utiliser la méthode FindControl() :

    Dim tb As TextBox
    tb = DirectCast(Me.monFormView.FindControle("monTextBox"), TextBox)

    Après il suffit de faire les requêtes SQL en conséquence...

    Cordialement


    Gilles TOURREAU - MVP C# - MCP - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    mercredi 2 juin 2010 08:49
    Modérateur
  • Bonjour Gilles,

    merci pour ce conseil avisé.

    Ceci répond partiellement à mon problème,dans la mesure ou je peux enregistrer la donnée dans la collection NewValues dans l'événement OnItemUpdating, mais je n'ai pas la valeur initiale qui correspond à la collection OldValues pour d'autres traitements.

     

    Pourquoi dans l'événement OnItemUpdating ( du "FormView2") les collections NewValues et OldValues sont vides ?

    Et comment faire pour que ces collections soient populées automatiquement comme dans la version du "FormView1" ?

     

    Comment compléter le code behind pour que la fonction du FormView1:

    <%# Bind("FirstName") %>
    

     soit traduite correctement dans le EditItemTemplate du FormView2 ?

     

    Merci pour votre aide,

    Marc-Antoine

    mercredi 2 juin 2010 20:28