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.버튼 클릭을 기반으로 ASP.NET FormView에서 사용자 정의 객체를 수정하는 방법은 무엇입니까?

사용자 지정 클래스의 인스턴스를 수정하는 FormView가 있습니다. 다양한 폼 컨트롤 (TextBox, DropDownList 등)이 정상적으로 작동합니다. 그러나, 아주 간단한 로직을 기반으로 DataItem의 상태를 수정할 Button을 포함하고 싶습니다. 이 변경을 혼란스럽게 제어 할 수있는 폼 컨트롤은 없습니다.

실제 상황에는 주소 입력 양식이 있습니다. 주소는 "표준"호주 주소 (도로 번호 및 이름, 교외 주 및 우편 번호) 일 수도 있고, 교외 (일부 구체적인 주소 요구 사항이있는 사람들) 이전에 3 개의 주소 라인이있는 "비표준"일 수도 있습니다. 나는 "더 많은 라인을 추가하라"라는 버튼을 원하면 클릭하면 오브젝트가 AddressLines.StandardAustralian에서 AddressLines.NonStandardAustralian으로 변경됩니다. 비표준 주소의 경우 "여분의 줄 제거"라고 쓰여있는 다른 단추가있을 것이고 클릭하면 그 과정을 뒤 바꿀 것입니다.

그래서 Button을 추가하고 코드 숨김에서 DataItem의 상태를 수정 해 보았습니다. 하지만 내가 만나는 문제는 FormView의 DataItem이 null/nothing이라는 것입니다. 이 SO question을 읽는 것으로부터, Button의 Click 이벤트가 발생하면 항목이 데이터 바인딩되지 않는다는 것이 문제인 것처럼 보입니다.

그래서, 질문; Button의 Click 이벤트 동안 FormView에 대한 DataItem을 가져올 수 있습니까? 그리고 그렇지 않은 경우 : 이것을 구현하기위한 내 옵션은 무엇입니까?

미리 감사드립니다. 뒤에

코드 :

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 

영문 :

<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

코드가 도움이됩니다. –

+0

FormView 및 DataSource에 대한 버튼 클릭 메서드 및 aspx 소스에 대한 코드 숨김이 추가되었습니다. 유용 할 수있는 다른 코드가 있다면 알려주십시오. – David

답변

1

, 그래서 나는이 작업을해야합니다. 아마도 그것을 할 수있는 최선의 방법은 아닙니다.

기본적으로 변경하고 싶은 값에 연결된 숨겨진 필드를 추가했습니다. 그런 다음 버튼의 클릭 이벤트 메서드에서 숨겨진 필드의 값을 수정하고 FormView에서 사용자 정의 클래스를 업데이트하도록했습니다. 이것은 FormView에서 DataItem을 가져오고 처음 시도 할 때 직접 수정하는 대신 사용됩니다.

관련 문제