1

リピーターを使用してリストを表示します(各レコードの横にある「remove」btnを使用)「remove」をクリックすると、リストから削除されます。commandArgumentを使用して「id」を渡します。別の値を渡したいです...「companyname」はテキストで試しましたが、渡す方法がわかりません...その後、コードの背後でcompanyNameを使用してcontractorId(会社名)を取得します請負業者のために

<td>
<asp:LinkButton ID="LinkButton1" CommandArgument='<%# Bind ("id") %>' runat="server" OnCommand="RemoveSubContractor" CssClass="bottomhyperlink">Remove</asp:LinkButton>
<asp:HiddenField id="hdnCompanyName" value='<%#Bind("Company_Name")%>'>
</td>

コードビハインド:

HiddenField hdnCompanyName = (HiddenField)e.CommandArgument.ToString("hdnCompanyName); 
string companyName = hdnCompanyName.Value;

次に、e.commandArgumentの後にコードビハインドから問題が発生します。.findControlを実行しようとしましたが、許可されませんでした...誰もが私が欠けているものを知っていますか?ありがとうございました

4

1 に答える 1

3

リピーターアイテムをループし、渡されたIDを持つアイテムを取得しCommandArgument='<%# Bind ("id") %>'、呼び出しFindControl()て会社名を取得できます。例を次に示します。

ASPX:

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:Label ID="lblId" runat="server" Text='<%# Eval("ID") %>' />
        <asp:HiddenField ID="hdCompanyName" runat="server" Value='<%# Eval("CompanyName") %>' />
        <asp:Button ID="btnSave" runat="server" OnCommand="Save" CommandArgument='<%# Eval("ID") %>' Text="Save" />
    </ItemTemplate>
</asp:Repeater>

背後にあるコード:

public partial class RepeaterExample : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            var employees = new List<Employee>()
            {
                new Employee{ Id="1",CompanyName="Company 1"},
                new Employee{ Id="2",CompanyName="Company 2"}
            };
            Repeater1.DataSource = employees;
            Repeater1.DataBind();
        }
    }

    protected void Save(object sender, CommandEventArgs e)
    {
        string id = e.CommandArgument.ToString();
        string companyName = string.Empty;

        foreach (RepeaterItem item in Repeater1.Items)
        {
            Label lblId = item.FindControl("lblId") as Label;
            if (lblId.Text.Equals(id))
            {
                companyName = (item.FindControl("hdCompanyName") as HiddenField).Value;
                break;
            }
        }
        System.Diagnostics.Debug.WriteLine(companyName);
    }
}

public class Employee
{
    public string Id { get; set; }
    public string CompanyName { get; set; }
}

おそらく、さらに良い解決策は、ID会社名の両方をこれに渡すことです。CommandArgumentこれにより、リピーターをループすることによって作成される余分な処理を回避できます。

ASPX:

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:Label ID="lblId" runat="server" Text='<%# Eval("ID") %>' />
        <asp:HiddenField ID="hdCompanyName" runat="server" Value='<%# Eval("CompanyName") %>' />
        <asp:Button ID="btnSave" runat="server" OnCommand="Save" CommandArgument='<%# String.Format("{0},{1}",Eval("ID"),Eval("CompanyName"))  %>' Text="Save" />
    </ItemTemplate>
</asp:Repeater> 

背後にあるコード:

文字列を分割するだけで、両方のパラメータがあります!

protected void Save(object sender, CommandEventArgs e)
{
    string [] arguments = e.CommandArgument.ToString().Split(',');
    string id = arguments[0];
    string companyName = arguments[1];
}
于 2013-02-10T14:45:31.907 に答える