2009-10-14 3 views
1

"txtName1, txtName2, txtName3 ..."및 "ddlAction1, ddlAction2, ddlAction3 ...."과 같은 ID로 사용되는 몇 가지 texboxt 및 드롭 다운 목록이 있습니다! 동적으로 텍스트 상자 및 드롭 다운 목록 ID를 다음과 같이 설정하십시오.동적으로 설정된 컨트롤 ID

for i as integer = 0 to 6 
    a = txtName+i.text 
    b = ddlAction+i.SelectedValue 
next i 

이 작업을 수행하는 데 도움이 필요하십니까? 감사합니다 ....

답변

3

열쇠는 예상 된 ID에 의해 제어를 조회하는 FindControl입니다 : 그 ID와 컨트롤이 발견되지 않는 경우

For i As Integer = 0 To 5 
    Dim txt As TextBox = TryCast(Me.Page.FindControl("txtName" & i.ToString()), TextBox) 
    Dim ddl As DropDownList = TryCast(Me.Page.FindControl("ddlAction" & i.ToString()), DropDownList) 

    If txt IsNot Nothing AndAlso ddl IsNot Nothing Then 
     Dim a As String = txt.Text 
     Dim b As String = ddl.SelectedValue 
    End If 
Next 

그것은 널 (null)/아무 것도 반환하지 않습니다.

FindControl은 전체 컨트롤 트리가 아닌 주어진 컨트롤 (또는 Page)의 immediate children 만 검색한다는 점에 유의하십시오. 재귀 적으로 검색하려면 고유 한 FindControl 메서드를 사용해야합니다.

Private Function FindControlRecursive(ByVal control As Control, ByVal id As String) As Control 
    Dim returnControl As Control = control.FindControl(id) 
    If returnControl Is Nothing Then 
     For Each child As Control In control.Controls 
      returnControl = child.FindControlRecursive(id) 
      If returnControl IsNot Nothing AndAlso returnControl.ID = id Then 
       Return returnControl 
      End If 
     Next 
    End If 
    Return returnControl 
End Function 
+0

그것은 내가 원하는 것 .... 감사합니다. –

+0

대답 -1 답변 lol. 오늘 밤 사람들은 관대하지 않습니다. – Polaris878

0

저는 웹 양식 전문가는 아니지만 페이지에있는 각 컨트롤에 대한 참조를 저장한다고 생각합니다.

웹 폼을 n 트리로 생각할 수 있습니다 ... 각 컨트롤에는 부모가 있으며 0에서 많은 자식까지 가질 수 있습니다. 따라서 정적 컨트롤이라면 상위 클래스에 대한 참조를 가져 와서이를 반복 할 수 있어야합니다 ... 하위 클래스 ID가 필요하지 않습니다.

또한 myControl["myID1"]과 같은 ID를 기반으로 어린이를 쿼리 할 수 ​​있으므로 숫자를 문자열과 연결하여 제어 할 수 있습니다.

마지막으로, 이들이 순전히 동적 컨트롤 인 경우 (즉, 몇 개가 있는지 모르는 경우), 순서가 지정된 컬렉션에 참조를 저장 한 다음 그 순서대로 반복합니다.

는 편집 : 여기

은 우리가 간다 :

다음
WebControl myControl; 
myControl.Controls.Add(someControlReference); 

는, ID에 의해 컨트롤을 잡아 : 거기에서

WebControl someControl = myControl.FindControl("someControlID1"); 

당신이 할 수처럼 :

string a = someControl.Text 
+0

이유 투표가? 설명해 주겠다고? – Polaris878

3

.Net은 코드가 수행하려고하는 것처럼 런타임보다는 컴파일 타임에 변수 이름을 확인해야합니다. 이것은 좋은 일입니다. 특정 유형의 오류를 방지합니다. 그러나이 특정 문제에 대한 대안적인 접근 방법을 찾아야 함을 의미합니다.

한 가지 옵션은 FindControl 기반의 방법입니다. 그러나 당신이 신경 쓰는 컨트롤은 페이지에서 함께 그룹화됩니다. 아직 없으면 패널과 같은 일반적인 컨테이너 컨트롤에 넣으십시오. 그럼 당신이 뭔가를 할 수 있습니다 (을 System.Linq 필요) :

For Each t As TextBox In MyContainer.Controls.OfType(Of TextBox)() 
    a = t.Text 
Next t 

For Each d As DropDownList In MyContainer.Controls.OfType(Of DropDownList)() 
    b = d.SelectedValue 
Next d 

을 또한, 나는 당신이 정말로 당신의 루프 내부에 할당 이외의 일을하고있어 바랍니다. 그렇지 않으면 대부분의 작업은 마지막 반복에서 단순히 변수에 값을 할당 한 루프를 종료 할 때 아무런 도움이되지 않습니다.

마지막으로 이러한 컨트롤이 쌍으로 작동하는 것처럼 보입니다. 나에게 그것은 사용자 컨트롤 구현을 요구하는 상황이다.

관련 문제