내 코드에서 컨트롤을 렌더링하는 데 사용하고있는 ListView 내부에 PlaceHolder 컨트롤이 있습니다. 내가 텍스트 상자에 입력 된 값을 검색하려면 다음 코드를 사용하고FindControl 함수를 사용하여 동적으로 생성 된 컨트롤을 찾는 방법은 무엇입니까?
TextBox tb = new TextBox();
tb.Text = quest.Value;
tb.ID = quest.ShortName.Replace(" ", "");
((PlaceHolder)e.Item.FindControl("ph_QuestionInput")).Controls.Add(tb);
:
foreach (ListViewDataItem di in lv_Questions.Items)
{
int QuestionId = Convert.ToInt32(((HiddenField)di.FindControl("hf_QuestionId")).Value);
Question quest = dc.Questions.Single(q => q.QuestionId == QuestionId);
TextBox tb = ((TextBox)di.FindControl(quest.ShortName.Replace(" ","")));
//tb is always null!
}
을하지만 컨트롤을 발견하지 아래 코드는 컨트롤을 추가합니다. 나는 ListViewDataItem의 컨트롤 볼 때 클라이언트 ID가 어떤 이유
ctl00_cphContentMiddle_lv_Questions_ctrl0_Numberofacres
:
을 나는 페이지와 내가 원하는 컨트롤의 소스 코드를 검토 한 결과이 ID를 가지고 ctl00_cphContentMiddle_lv_Questions_ctrl0_ctl00
Numberofacres를 ctl00으로 변경하는 이유는 무엇입니까? 이 문제를 해결할 수있는 방법이 있습니까?
UPDATE :
그냥 난 후 Page_Init 이벤트 내 ListView에 데이터 바인딩하고, 명확하게. 그런 다음 ListView의 ItemBound 이벤트에 컨트롤을 만듭니다. 그러나 @Womp와 MSDN이 말하는 것은 컨트롤이 Load 이벤트 (Page_Init 이벤트 이후) 이후 ViewState에 없을 때까지 실제로 생성되지 않는다는 것입니다. 이 소리가 맞습니까?
내 OnClick 이벤트에서 내 동적 컨트롤의 값을 검색 할 때 그렇다면 단지 그렇습니까?
UPDATE 2 :
protected void Page_Init(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
//databind lv_Questions
}
}
에 :
그래서 난에서 내 후 Page_Init 이벤트에 내가 가진 코드를 변경
protected void Page_Init(object sender, EventArgs e)
{
//databind lv_Questions
}
그리고 그것은 내 문제를 해결했습니다. 아직도 포스트 백인지 여부에 관계없이 데이터 바인딩을 원하지만 문제가 해결 된 이유는 조금 혼란 스럽습니다.
PlaceHolder 컨트롤의 내부 동작을 알 수는 없지만 PlaceHolder 컨트롤을 찾을 때 자식 컨트롤이없는 것을 확인했습니다. 내 게시물의 마지막 5 줄을 기반으로 TextBox 컨트롤이 있다고 가정하지만 ID가 변경되었습니다 (Numberofacres에서 ctl00으로 끝날 때까지). –
다시 게시 할 때마다 텍스트 상자를 똑같은 방법으로 다시 만듭니다 (같은 컨테이너에 같은 순서로 추가)? – womp
'! this.IsPostBack' 때만 생성합니다. OnClick 단추 이벤트에서 이러한 컨트롤에 입력 된 값을 검색하려고합니다. –