2017-10-17 3 views
2

소개나는 쇼핑 웹 사이트를 구축 할 필요가 대학 프로젝트를 진행하고

ASP.Net 리피터에서 특정 컨트롤에 액세스하는 방법.

저는 현재 다음과 같은 구조의 "장바구니 관리"페이지를 구축하고있다 : 내 질문에 대한 중요한 것은 enter image description here

는 "제품"입니다. "제품"은 ItemTemplate 컨트롤 만 사용하는 ASP.Net 중계기입니다. 리피터는 사용자의 카트에있는 제품 목록으로 채워집니다.

무슨 문제입니까?

"저장"버튼과 관련하여 문제가있는 부분이 있습니다. 사용자는 원하는 각 제품의 수량을 변경할 수 있습니다. 그러나 정보를 데이터베이스에 저장하려면 "저장"단추를 클릭해야합니다.

내 저장 버튼의 onclick 이벤트 내에 수량 입력란에 올바른 숫자로 액세스하는 데 문제가 있습니다.

내 저장 버튼의 모든 OnClick 이벤트에서 올바른 텍스트 상자에 액세스하려면 어떻게해야합니까?

무엇을 시도 했습니까?

처음에는 WebControl.FindControl 메서드를 사용하려고 생각했습니다. 물론 FindControl에는 ID가 필요하며 각 입력란마다 다른 ID가 필요합니다. 이 ID의 문제는, 내가 노력 수정하기 위해

... 먼저

...

는 텍스트 상자 ID와 제품 ID를 결합했습니다.

<asp:TextBox ID='quantity<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' /> 

나는 그런 다음 불가능하다는 것을 알았습니다. ID를이 방법으로 설정할 때 "간단한 ID"(예 : "button1")를 사용해야하기 때문입니다. 아마도 코드 숨김에 ID를 설정할 수 있습니다. 둘째

... 그때 리피터의 OnItemCreated 이벤트를 동적으로 X는 제품 ID입니다 텍스트 상자에 "quantityX"의 ID를 설정하는 데 사용하여 시도

. 내가있는 WebControl 속성에 제품 ID를 결합되어 했는가

:

<asp:TextBox ID='quantity' productId='<%#Eval("productId") %>' runat="server" TextMode="Number" min="1" Text='<%#Eval("selectedQuantity") %>' max='<%#Eval("availableQuantity") %>' /> 

이 후, 나는 다음 "양"의 ID와 TextBoxs을 얻기 위해 FindControl() 방법을 사용하여. TextBox를 찾은 후에는 productId 속성을 가져 와서 그 값을 TextBox ID에 추가합니다.

protected void productsList_ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    if(e.Item.ItemType == ListItemType.Item) 
    { 
     TextBox quantity = (TextBox)e.Item.FindControl("quantity"); 
     quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]); 
    } 
} 

그런 다음 productId 속성에 값이 없음을 알았습니다. 왜냐하면 DataBinding이 발생하지 않았기 때문입니다. 즉, Eval("productId")이 실행되고 있지 않습니다. 셋째

은 ...

나는 한 차이가 이전과 동일한 착수했습니다. OnItemCreated 이벤트 대신 Repeater의 OnItemDataBound 이벤트를 사용했습니다.

protected void productsList_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if(e.Item.ItemType == ListItemType.Item) 
    { 
     TextBox quantity = (TextBox)e.Item.FindControl("quantity"); 
     quantity.ID = String.Format("quantity{0}", quantity.Attributes["productId"]); 
    } 
} 

부분적으로 작동합니다. 그러나 한 가지 문제가있었습니다. 제품 ID가 가장 큰 제품을 건너 뛰었습니다. (E.X, 제품 4, 32, 68이있는 경우 제품 ID 68은 건너 뜁니다.)

아래 이미지에서 알 수 있듯이 3 가지 제품이 있습니다. TextBox를 분명하게 가리 키기 위해 (렌더링 된대로) 일부 텍스트를 편집했습니다.

존재하는 ID는 1, 32 및 34입니다. 1과 32의 ID 속성을 보면 제품 ID가 추가 된 "수량"이 표시됩니다.

ID 속성은 34입니다. ID 속성은 "수량"입니다.

나는 이제 막 붙어있다.

enter image description here

나는 무엇을 사용하고?

  • 비주얼 스튜디오 2017
  • .NET 프레임 워크 4.6.1
  • 2 계층 웹폼 프로젝트
  • 구글 크롬
+0

사용 ASP 컨트롤을. – AsifAli72090

+0

@ Asif.Ali ASP 컨트롤을 사용하고 있습니다 ... OP의 마지막 이미지는 크롬의 개발자 도구에서 렌더링 된 페이지의 스크린 샷입니다. – Tyler

+0

저장 버튼 클릭 이벤트에서 텍스트 상자에 액세스하는 데 문제가 있습니까? – AsifAli72090

답변

1

에서 텍스트 상자의 텍스트를 얻으려면 버튼을 클릭하여 저장 버튼을 클릭하십시오 :

세 번째 접근 방식에서

// get item on where button is clicked 
RepeaterItem item = (RepeaterItem)((Button) sender).NamingContainer; 

// get correct textbox from the item 
TextBox txtQuantity = (TextBox)item.FindControl("quantity"); 

string qtyText = txtQuantity.Text; 
는 END_LINK하면 관심있는에만 DataItems을 확인하지만 당신은 또한 AlternatingItems에 그것을 확인해야 : 대신 간단한 HTML의

if (e.ItemType == ListItemType.Item || e.ItemType == ListItemType.AlternatingItem) 
+0

내 OP에서 언급했듯이 텍스트를 가져 오는 데 필요한 여러 TextBox가 있습니다. 제품 당 1 개의 수량 텍스트 상자가 있습니다. 제공된 코드를 사용하면 첫 번째 텍스트 상자 만 렌더링됩니다. 두 번째 제품의 "저장"버튼은 첫 번째 제품의 "수량"이 아닌 두 번째 제품의 "수량"에 액세스해야합니다. PS - 잠깐 기다려서 수업이 다시 시작되었습니다. 다음 기간이 시작되기 전에 10 분 밖에 안 남았습니다. – Tyler

+0

텍스트 상자가 리피터 안에 있으면 리피터에 여러 텍스트 상자가 필요하므로 제대로 작동합니다. – AsifAli72090

+0

아 ...따라서 RepeaterItem은 기본적으로 동적 ID 설정을 처리합니다. 그것은 완벽하게 잘 작동하는 것으로 보입니다. 감사! – Tyler

관련 문제