動的にASP.NETの変更ドロップダウンコントロールIDインサイドリピーターアイテム
-
06-09-2019 - |
質問
誰かが、私はこの仕事を得ることができる方法を教えてもらえます。私は、Repeaterコントロール内のドロップダウンコントロールを区別します。私はライフサイクルについては今理解し、どのようにバッファがすでに書かれているが、私の選択肢は何ですか?ここでは何が起こるかです。
コードファイル
Dim repeatTimes((TotalAdInsured - 1)) As Integer
myRepeater.DataSource = repeatTimes
myRepeater.DataBind()
Aspfile
<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%>' は有効な識別子ではありません。
。
解決
私は、ドロップダウンを区別したいです Repeaterコントロール内のコントロールます。
あなたがする必要はありません。ここであなたを助けるかもしれないいくつかのサンプルコードがあります:
マークアップ:
<%@ 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);
}
}
他のヒント
あなたはそのようなマークアップを通じて、中継器内部の一意のIDを作成することはできません。ただし上にFindControlするを使用して分離コードのドロップダウンを取得することができますリピーターます。
Dim adTitle As DropDownList = MyRepeater.FindControl("AdTitle")
If (Not adTitle Is Nothing) Then
''Do something here
End If
[OK]を...一言で言えば、あなたはあなたが現在それをやっている方法で、何をしようとして行うことはできません。
コントロールのIDプロパティは、タグと単純な値のID属性を使用して設定することができます。例:
<asp:Button runat="server" id="Button1" />
私はあなたがやろうとかを見ることができますが、なぜ...
私は本当に理解していませんリピーター制御は、あなたのデータソース内の項目ごとに1つのアイテムを、含まれていますので、それは次の行のものとは異なるID="AdTitle"
になるようにちょうどあなたのDropDownList 'AdTitle'
を呼び出すために完全に罰金です。
サーバ側でそれらを取り戻すために、あなただけのその項目の特定のDropDownListを得るためにあなたのリピータ&FindControl("AdTitle")
の項目を反復処理します。
は、あなたがDropDownListコントロールを作成し、ItemTemplateにに追加し、おそらくItemDataBound
イベントに(プログラム的にこれを行う必要があります。
BCの答えに拡大:チェックボックスで、私は選択肢を永続化すると、その使用されるようにIDを設定するのに必要とはいえ、私は最近、同じ問題がありました。少し不格好しかし、項目データにバインドされたとき、私はそれをやりました。
ここでは、マークアップです。
<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(); } }
だから私は、ループTHRUと確認され、それらの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 } } }
あなたはRepeater.ItemDataBoundにイベントハンドラを追加し、アイテムのコンテナへの参照を使用してハンドラ内でコントロールを作成することができます。