2011-09-08 10 views
0

ListBoxコントロールからTextBoxコントロールのClientID値を取得する際に問題があります。 私はこの構文が私にClientIDを返すと思った(非常に奇妙な): ((TextBox)e.Item.FindControl( "amount"))。ListBoxのItemDataBoundイベント内でTextBoxコントロールのClientIDを取得する方法は?

が、それはこの例外をスローし続ける:

は、「インデックスが範囲外でした負でないコレクションのサイズよりも小さくなければなりません パラメータ名:インデックス」

どれでも助けが大変ありがとうございます。 ASPX: 以下は私のコードである

<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

関連する問題