2

どうすればこれを機能させることができるか教えてもらえますか。リピーター コントロール内のドロップダウン コントロールを区別したい。ライフサイクルとバッファが既にどのように書き込まれているかについて理解しましたが、代替手段は何ですか? これが何が起こるかです

コードファイル

    Dim repeatTimes((TotalAdInsured - 1)) As Integer

    myRepeater.DataSource = repeatTimes
    myRepeater.DataBind()

ASPファイル

<asp:Repeater ID="myRepeater" runat="server">
    <ItemTemplate>
         <asp:DropDownList ID="AdTitle<%# Container.ItemIndex %>" runat="server">
             <asp:ListItem Selected="True" Value="" Text=""/>
             <asp:ListItem Selected="False" Value="Miss" Text="Miss"/>
             <asp:ListItem Selected="False" Value="Ms" Text="Ms"/>
             <asp:ListItem Selected="False" Value="Mrs" Text="Mrs"/>
             <asp:ListItem Selected="False" Value="Mr" Text="Mr"/>
             <asp:ListItem Selected="False" Value="Other" Text="Other"/>
         </asp:DropDownList>
    </ItemTemplate>
</asp:Repeater>

このエラーを返します

パーサー エラー メッセージ: 'AdTitle<%# Container.ItemIndex %>' は有効な識別子ではありません。

4

5 に答える 5

5

リピーターコントロール内のドロップダウンコントロールを区別したい。

あなたはする必要はありません。これがあなたを助けるかもしれないいくつかのサンプルコードです:

マークアップ:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label runat="server" ID="lblMsg" Text="Click a button" />
        <hr />
        <asp:Repeater runat="server" ID="rptAwesome" onitemcommand="rptAwesome_ItemCommand"
            >
            <ItemTemplate>
                <asp:Button runat="server" ID="btnAwesome"
                    Text='<%# "Button #" + Container.ItemIndex %>'
                    CommandArgument='<%# Container.DataItem %>'/><br />
            </ItemTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>

コードビハインド:

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            var x = new int[] { 1, 2, 3, 4, 5 };
            rptAwesome.DataSource = x;
            rptAwesome.DataBind();
        }
    }
    protected void rptAwesome_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        Button btnAwesome = (Button)e.CommandSource;
        lblMsg.Text = string.Format("btnAwesome.ID = {0}, e.CommandArgument = {1}", btnAwesome.ID, e.CommandArgument);
    }
}
于 2009-05-31T15:19:46.520 に答える
3

このようなマークアップでは、リピーター内に一意のIDを作成することはできません。ただし、リピーターのFindControlを使用して、コードビハインドのドロップダウンを取得できます

Dim adTitle As DropDownList = MyRepeater.FindControl("AdTitle")
If (Not adTitle Is Nothing) Then
  ''Do something here
End If
于 2009-05-31T15:19:22.387 に答える
1

わかりました...一言で言えば、あなたはあなたが現在それをしている方法であなたがしようとしていることをすることはできません。

コントロールのIDプロパティは、タグのID属性と単純な値を使用してのみ設定できます。例:<asp:Button runat="server" id="Button1" />

あなたが何をしようとしているのかはわかりますが、なぜかわかりません...

リピーターコントロールには、データソース内のアイテムごとに1つのアイテムが含まれるため、DropDownListを呼び出すだけで、次の行のアイテムID="AdTitle"とは異なるため、まったく問題ありません。'AdTitle'

それらをサーバー側に戻すには、リピーター内のアイテムを繰り返し処理して、そのアイテムFindControl("AdTitle")の特定のDropDownListを取得します。

IDをインクリメントすることがどうしても必要な場合は、プログラムでこれを行う必要があります(おそらく、ItemDataBoundイベントでDropDownListを作成し、それをItemTemplateに追加します。

于 2009-05-31T15:18:32.623 に答える
1

BC の回答を拡張する: 最近、同じ問題が発生しましたが、チェックボックスがありましたが、選択を永続化するときに使用した ID を設定する必要がありました。少し不格好ですが、Item Data Bound のときにやりました。

マークアップは次のとおりです。

<asp:Repeater ID="Repeater1" runat="server" >
<HeaderTemplate>Header<br /><br /></HeaderTemplate>
<ItemTemplate>
    <asp:CheckBox ID="cb" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>' />
     ...other controls removed for brevity
</ItemTemplate>
<FooterTemplate>
    <asp:Button ID="Button1" runat="server" OnClick="Submit" Text="Submit" />
</FooterTemplate>
</asp:Repeater>

このクラスのコレクションをセットアップしてバインドしました

public class mst
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Number { get; set; }
    public bool NumberRequired { get; set; }
}

Page_Load で必要なことを行う

        Repeater1.ItemDataBound += new RepeaterItemEventHandler(Repeater1_ItemDataBound);
        Repeater1.DataSource = listOfMsts;
        Repeater1.DataBind();

続いて、IDを設定した場所:

    void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var mst = (mst)e.Item.DataItem;
            ((CheckBox)e.Item.FindControl("cb")).ID = mst.Id.ToString();
        }
    }

したがって、送信ボタンが押されると、ループしてチェック済みの ID を取得し、保存できます。

  protected void Submit(object sender, EventArgs e)
    {
    foreach (var item in Repeater1.Items)
        {
            var checkboxes = ((RepeaterItem)item).Controls.OfType<CheckBox>().ToList();
            if (checkboxes[0].Checked)
            {
                Save(checkboxes[0].ID);
                ....other stuff
            }
        }
    }
于 2012-02-05T21:36:06.967 に答える
0

イベントハンドラーをRepeater.ItemDataBoundに追加し、アイテムコンテナーへの参照を使用してハンドラー内にコントロールを作成できます。

于 2009-05-31T15:15:46.950 に答える