我正在尝试在 GridView 上的 AJAXToolKit 中实施 CascadingDropdown 。 一切正常,下拉菜单获取并填充数据。
但是,当我尝试在下拉列表中添加 BehaviorID 属性时(为了帮助在JavaScript中识别它以便我可以将add_populated()
函数绑定到它,它会给我以下错误消息。
"具有相同ID的两个组件' {BehaviorID} '无法添加到应用程序中。"
我怀疑是因为应用程序试图为GridVivew中的每个级联下拉列表分配相同的BehaviorID。
有什么想法吗?
ASPX:
<asp:GridView ID="grdTInfo" runat="server" AutoGenerateColumns="False" onrowdatabound="grdTInfo_RowDataBound" ShowFooter="True" EnableModelValidation="True" >
<Columns>
<asp:TemplateField HeaderText="TDBID" Visible="False">
<EditItemTemplate>
<asp:TextBox ID="TextBox8" runat="server" Text='<%# Bind("TSId") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="TSID" runat="server" Text='<%# Bind("TSId") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField HeaderText="SL.No" >
<ItemStyle BorderStyle="Solid" BorderWidth="1px" Font-Names="Calibri"
Font-Size="Small" HorizontalAlign="Center" VerticalAlign="Middle" Width="1%"
Wrap="False" />
</asp:BoundField>
<asp:TemplateField HeaderText="HPname">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("PName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemStyle BorderStyle="Solid" BorderWidth="1px" Font-Names="Calibri"
Font-Size="Small" HorizontalAlign="Center" VerticalAlign="Middle" Width="15%"
Wrap="False" />
<ItemTemplate>
<asp:DropDownList ID="ddlPractice" runat="server" Width="100%">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="HTName">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("TName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemStyle BorderStyle="Solid" BorderWidth="1px" Font-Names="Calibri"
Font-Size="Small" HorizontalAlign="Center" VerticalAlign="Middle" Width="15%"
Wrap="False" />
<ItemTemplate>
<cc1:DynamicDropDownList ID="ddlTask" runat="server" Width="100%"
OnSelectedIndexChanged="ddlTask_SelectedIndexChanged">
</cc1:DynamicDropDownList>
<ajaxToolkit:CascadingDropDown ID="ccdTask" runat="server" Category="Task" TargetControlID="ddlTask" PromptText="Select Task" LoadingText="Loading Tasks.." ServiceMethod="BindTaskDetails" ServicePath="CascadingDropdown.asmx">
</ajaxToolkit:CascadingDropDown>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="STask">
<EditItemTemplate>
<asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("STName") %>'></asp:TextBox>
</EditItemTemplate>
<ItemStyle BorderStyle="Solid" BorderWidth="1px" Font-Names="Calibri"
Font-Size="Small" HorizontalAlign="Center" VerticalAlign="Middle" Width="10%"
Wrap="False" />
<ItemTemplate>
<cc1:DynamicDropDownList ID="ddlST" runat="server" Width="100%" >
</cc1:DynamicDropDownList>
<ajaxToolkit:CascadingDropDown BehaviorID="abc" ID="ccdST" runat="server" Category="ST" ParentControlID="ddlTask" TargetControlID="ddlST" PromptText="Select Sub-task" LoadingText="Loading Sub-tasks.." ServiceMethod="BindSTDetails" ServicePath="CascadingDropdown.asmx" >
</ajaxToolkit:CascadingDropDown >
</ItemTemplate>
</asp:TemplateField>
</Columns>
答案 0 :(得分:1)
经过一番研究,我找到了解决方案。
在创建 GridView 时,我们应该为 GridView 的每一行中创建的每个下拉列表提供唯一的BehaviorID。
因此,我们可以覆盖grdTInfo_RowCreated
事件,为每个下拉列表分配唯一的BehaviorID,如下所示
protected void grdvTimelogInfo_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
// Programmatically reference the PopupControlExtender
CascadingDropDown cc1 = e.Row.FindControl("ccdTask") as CascadingDropDown;
CascadingDropDown cc2 = e.Row.FindControl("ccdST") as CascadingDropDown;
// Set the BehaviorID
string behaviorID = string.Concat("cc1", e.Row.RowIndex);
cc1.BehaviorID = behaviorID;
string behaviorID2 = string.Concat("cc2", e.Row.RowIndex);
cc2.BehaviorID = behaviorID2;
}
}