1

TextBoxの中にもあるのItemTemplateです。RepeaterItemTemplate

私が持っているサーバー側:

protected void txtValorMaterialAsign_TextChanged(object sender, EventArgs e)
{
    string controlId = ((TextBox)sender).ClientID;
}

その結果:

rptFilasDeUnMaterial_ctl04_txtValorMaterialAsign

ただし、そのコントロールのクライアント側のIDは(ChromeのF12によると)次のとおりです。

ctl00_contenido_wucMateriales_rptMateriales_ctl00_rptFilasDeUnMaterial_ctl01_txtValorMaterialAsign

サーバー側のコードから完全なIDを取得するにはどうすればよいですか?

4

3 に答える 3

3

これは私のために働いた:

var myResult1 = FindControl("ctl00").FindControl("MainContent")
                                    .FindControl("text1").UniqueID;

戻り値:

ctl00 $ MainContent $ text1

UniqueID単純なfindControlを試してください。それが機能しない場合は、findControlsをネストします。

于 2012-08-21T23:03:30.053 に答える
2

多分これはあなたにアイデアを与えます:

HTML:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" %>
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
  <asp:Repeater ID="repPeople" runat="server">
        <ItemTemplate>
            <asp:TextBox runat="server" ID="txtName" OnDataBinding="text_databinding" Text='<%# Eval("Name")%>'></asp:TextBox>
        </ItemTemplate>
  </asp:Repeater>
</asp:Content>

コードビハインド:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<Person> tmp = new List<Person>();
        tmp.Add(new Person() { LastName = "Escano", Name = "Hanlet" });
        tmp.Add(new Person() { LastName = "Escano", Name = "Hanlet" });
        tmp.Add(new Person() { LastName = "Escano", Name = "Hanlet" });
        tmp.Add(new Person() { LastName = "Escano", Name = "Hanlet" });
        tmp.Add(new Person() { LastName = "Escano", Name = "Hanlet" });
        this.repPeople.DataSource = tmp;
        this.repPeople.DataBind();
    }
    public void text_databinding(object sender, EventArgs e)
    { 
        Response.Write(((TextBox)sender).ClientID + "<br />") ;
    }
}

public class Person
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

出力:

MainContent_repPeople_txtName_0
MainContent_repPeople_txtName_1
MainContent_repPeople_txtName_2
MainContent_repPeople_txtName_3
MainContent_repPeople_txtName_4

したがって、テキストボックスのOnDataBindingをほとんど使用してから、送信者をにキャストします。TextBoxを使用する必要はありませんFindControl()

于 2012-08-21T22:58:14.057 に答える
1

あなたはこのようなことを試すことができます..

ヘッダーでコントロールを見つけるには:

textcontrol = repeater1.Controls[0].Controls[0].FindControl("txtValorMaterialAsign");

フッターでコントロールを見つけるには:

textcontrol = repeater1.Controls[repeater1.Controls.Count - 1].Controls[0].FindControl("txtValorMaterialAsign");

拡張メソッドを使用

public static class RepeaterExtensionMethods
{
    public static Control FindControlInHeader(this Repeater repeater, string controlName)
    {
        return repeater.Controls[0].Controls[0].FindControl(controlName);
    }

    public static Control FindControlInFooter(this Repeater repeater, string controlName)
    {
        return repeater.Controls[repeater.Controls.Count - 1].Controls[0].FindControl(controlName);
    }
}
于 2012-08-21T22:50:54.803 に答える