2010-04-22 5 views
0

NB. I am going to be away until Tuesday next week. So all help is appreciated but I will be unable to comment/respond until then.Comment puis-je modifier un objet personnalisé dans un formulaire ASP.NET FormView en cliquant sur un bouton?

J'ai un formulaire qui modifie une instance d'une classe personnalisée. Les différents contrôles de formulaire (TextBox, DropDownList, etc.) fonctionnent correctement. Cependant, je veux inclure un bouton qui va modifier l'état du DataItem basé sur une logique très simple. Il n'y a aucun contrôle de forme qui pourrait contrôler ce changement d'une manière non confuse.

La situation actuelle est que j'ai un formulaire pour entrer une adresse. L'adresse peut être une adresse australienne «standard» (rue et nom, état de banlieue et code postal) ou peut être «non standard», ce qui signifie qu'il y a 3 lignes d'adresses avant banlieue (pour les personnes ayant des besoins d'adresses plus spécifiques). Je veux un bouton qui dit "ajouter plus de lignes" et en cliquant dessus il va changer l'objet d'être AddressLines.StandardAustralian à AddressLines.NonStandardAustralian. Pour les adresses non standard, il y aura un autre bouton qui dit "Supprimer les lignes supplémentaires" et un clic qui inverse le processus. J'ai donc essayé d'ajouter un bouton et de modifier l'état du DataItem dans le code-behind. Mais le problème que je rencontre est que DataItem de FormView est null/nothing. De la lecture de ce SO question, il semble que le problème est que l'élément n'est pas databound lorsque l'événement Click du bouton est déclenché.

Donc, la question; Est-il possible d'obtenir le DataItem pour FormView pendant un événement Click d'un bouton? et si non: quelles sont mes options pour implémenter ceci?

Merci d'avance.

code Derrière:

Private ReadOnly Property addressView() As AddressView 
    Get 
     Return CType(FormView1.DataItem, AddressView) ' <-- But DataItem is Nothing when called from lbMakeNonStd_Click 
    End Get 
End Property 

Protected Sub lbMakeNonStd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbMakeNonStd.Click 
    If addressView IsNot Nothing Then 

     Select Case addressView.NonStd 
      Case AddressLines.StandardAustralian 
       addressView.NonStd = AddressLines.NonStandardAustralian 

      Case AddressLines.NonStandardAustralian 
       addressView.NonStd = AddressLines.StandardAustralian 

      Case Else 
       ' Other cases ignored, shouldn't change address lines 
     End Select 
    End If 
End Sub 

Aspx:

<asp:FormView ID="FormView1" runat="server" DataKeyNames="IDNO, AddressType" DataSourceID="ObjectDataSource1" EnableViewState="true" > 
<ItemTemplate> 
    ... 
</ItemTemplate> 
<EditItemTemplate> 
    <fieldset> 
    <legend>Address</legend> 
    <asp:UpdatePanel ID="upAddressFields" runat="server" UpdateMode="Conditional"> 
    <Triggers> 
     <asp:AsyncPostBackTrigger controlid="txtPostcode" eventname="TextChanged" /> 
    </Triggers> 
    <ContentTemplate> 
    <asp:Table ID="tblForm" runat="server"> 
     <asp:TableRow ID="trName" runat="server"> 
      <asp:TableHeaderCell ID="TableCell1" runat="server"> 
       Name 
      </asp:TableHeaderCell> 
      <asp:TableCell ID="TableCell2" runat="server"> 
       <asp:TextBox ID="tbName" runat="server" Text='<%# Bind("AlternateName") %>' MaxLength="30"></asp:TextBox> 
      </asp:TableCell> 
     </asp:TableRow> 
     <asp:TableRow ID="TableRow2" runat="server" Cs> 
      <asp:TableHeaderCell ID="TableCell3" runat="server"> 
       Number and Street 
      </asp:TableHeaderCell> 
      <asp:TableCell ID="TableCell4" runat="server"> 
       <asp:TextBox ID="tbLine1" runat="server" Text='<%# Bind("Line1") %>' MaxLength="30"></asp:TextBox> 
       <asp:PlaceHolder ID="phMakeNonStdButton" runat="server">(<asp:LinkButton ID="lbMakeNonStd" runat="server" Text="Add more lines..." />)</asp:PlaceHolder> 
      </asp:TableCell> 
     </asp:TableRow> 
     <asp:TableRow ID="trLine2" runat="server" CssClass="tablerowbg_light"> 
      <asp:TableHeaderCell ID="TableCell5" runat="server"> 
       Line 2 
      </asp:TableHeaderCell> 
      <asp:TableCell ID="TableCell6" runat="server"> 
       <asp:TextBox ID="tbLine2" runat="server" Text='<%# Bind("Line2") %>' MaxLength="30"></asp:TextBox> 
       <br /><asp:LinkButton ID="lbMakeStd" runat="server" Text="Use fewer lines..." /> 
      </asp:TableCell> 
     </asp:TableRow> 
    </asp:Table> 
    </ContentTemplate> 
    </asp:UpdatePanel> 
    <asp:LinkButton ID="lbUpdate" runat="server" CommandName="Update" ValidationGroup="ResidentialAddress" Font-Bold="true">Save Changes</asp:LinkButton> | 
    <asp:LinkButton ID="lbCancel" runat="server" CommandName="Cancel" CausesValidation="false">Cancel</asp:LinkButton> 
</EditItemTemplate> 

+0

Le code aiderait. –

+0

Ajout de code-behind pour la méthode de clic de bouton et la source aspx pour FormView et DataSource. Faites-moi savoir s'il y a un autre code qui pourrait être utile. – David

Répondre

1

Ok, donc j'ai ce travail. Peut-être pas la meilleure façon de le faire cela fonctionne.

Fondamentalement, j'ai ajouté un champ caché lié à la valeur que je voulais changer. Ensuite, dans la méthode d'événement click du bouton, j'ai modifié la valeur du champ caché et laissé la mise à jour FormView la classe personnalisée. C'est au lieu d'obtenir le DataItem à partir de FormView et de le modifier directement comme j'essayais au début.