2011-09-08 4 views
0

ListView 컨트롤에서 TextBox 컨트롤의 ClientID 값을 검색하는 데 문제가 있습니다. 이 구문이 내게 ClientID를 매우 좋게 반환 할 것이라고 생각했습니다. 매우 이상합니다. (TextBox) e.Item.FindControl ("amount")) ClientID;ListView의 ItemDataBound 이벤트 내에서 TextBox 컨트롤의 ClientID를 검색하는 방법은 무엇입니까?

그러나이 예외가 던져 계속 :

가. "인덱스가 범위를 벗어났습니다은 컬렉션의 크기보다 음이 아닌 및 작아야합니다 매개 변수 이름 :. 인덱스"

모든 도움이 대단히 감사합니다. 영문 : 다음은 내 코드입니다

<asp:ListView ID="categories" runat="server" 
    ClientIDRowSuffix="ID" 
    ItemPlaceholderID="categoryItem" 
    DataKeyNames="ID" onitemdatabound="categories_ItemDataBound"> 
    <ItemTemplate>    
      <div class="category"> 
       <asp:TextBox ID="amount" runat="server" />     
      </div> 
    </ItemTemplate> 

</asp:ListView> 

코드 숨김 :

public string AmountTextBoxClientID { get; set; } 

    protected string GetAmountTextBoxClientID() 
    { 
     return this.AmountTextBoxClientID; 
    } 


protected void categories_ItemDataBound(object sender, ListViewItemEventArgs e) 
    { 
     switch (e.Item.ItemType) 
     { 
      case ListViewItemType.DataItem: 

       TextBox amountTextBox = (TextBox)e.Item.FindControl("amount");//this line excutes without any error 
       amountTextBox.Text = categoryAmount.ToString("C"); 
       amountTextBox.Attributes.Add("readonly", "readonly"); 

       this.AmountTextBoxClientID = amountTextBox.ClientID; //this line keeps throwing the OutOfRange exception 
       break; 
     } 

    } 

답변

0

임 두려워 나는 당신의 문제를 정확하게 파악하지 못할하지만 난 당신이 주어지고 아래에 붙여 넣은 내용에 따라 페이지를 작성했다. 오류가 아닙니다.

<%@ Page Language="C#" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<script runat="server"> 
    public string AmountTextBoxClientID { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("column1"); 
     DataRow dr = dt.NewRow(); 
     dr[0] = "some data"; 
     dt.Rows.Add(dr); 

     ListView1.DataSource = dt; 
     ListView1.DataBind(); 
    } 

    protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e) 
    { 
     TextBox tbAmount = (TextBox)e.Item.FindControl("amount"); 
     this.AmountTextBoxClientID = tbAmount.ClientID; 
    } 
</script> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:ListView ID="ListView1" runat="server" onitemdatabound="ListView1_ItemDataBound"> 
      <ItemTemplate> 
       <asp:TextBox ID="amount" runat="server" /> 
      </ItemTemplate> 
     </asp:ListView> 
    </div> 
    </form> 
</body> 
</html> 
+0

기독교인, 제 문제를 살펴 주셔서 감사합니다. 내 문제를 알아 냈다고 생각해. Page_Load 이벤트에서 내 데이터 소스를 바인딩하지 않았습니다. 내 사용자 컨트롤의 base.bind() 메서드에서 Databind() 메서드를 호출하고있었습니다. 이 문제에 대한 내 해결 방법은 ListView 컨트롤이 페이지에 완전히로드 된 후이 코드를 사용하는 것입니다. foreach (this.categories.Items의 ListViewItem li) { TextBox tbox = (TextBox) li.FindControl ("amount"); this.AmountTextBoxClientID = tbox.ClientID; } – netNewBee

관련 문제