我在数据中继器中有一个组合框,我需要从其余重复的组合框中删除组合框的选定值,以便我可以禁止在多个组合框中多次选择相同值:
如果组合框1的选定值是"约翰·史密斯",我需要从其他重复的组合框中删除"约翰·史密斯"。有什么帮助吗?
<asp:Repeater ID="rptTableMapper" runat="server" DataSourceID="dsSQLColumnNames"
OnItemDataBound="rptTableMapper_ItemDataBound">
<ItemTemplate>
<table width="500px">
<tr>
<td>
<dx:ASPxComboBox ID="cmbCsvColumns" OnSelectedIndexChanged="cmbCsvColumns_SelectedIndexChanged"
runat="server" AutoPostBack="True">
</dx:ASPxComboBox>
</td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
后面的代码是
protected void cmbCsvColumns_SelectedIndexChanged(object sender, EventArgs e)
{
string s = ((ASPxComboBox)(sender)).ClientID;
string text = ((ASPxComboBox)(sender)).Text;
for (int i = 0; i < rptTableMapper.Items.Count; i++)
{
ASPxComboBox cmb = (ASPxComboBox)(rptTableMapper.Items[i].FindControl("cmbCsvColumns"));
ListEditItem selectedItem = ((ASPxComboBox)(sender)).SelectedItem;
if (cmb.ClientID != s)
{
}
}
}
我不确定这是否是您的业务要求或什么,但我的建议是不要从下拉列表中删除该条目。假设在第 1 行中用户选择了值 1,因此值 1 从剩余行的其他下拉列表中删除,在第 2 行中,用户选择值 2,其余值也会被删除。现在在第 1 行中,用户选择值 3,现在您必须从剩余的下拉列表中删除值 3,并在其中添加值 1。
我的建议是调用一个javascript方法并在javascript中保存您选择的值,如果用户选择了一个已经选择的值,只需给他一个警报,说明您已经选择了这个值。通过此方法,如果仅执行回发以删除值,则还可以减少服务器端回发。
所以你的解决方案应该是这样的:
<asp:Repeater ID="rptTableMapper" runat="server" DataSourceID="dsSQLColumnNames"
OnItemDataBound="rptTableMapper_ItemDataBound">
<ItemTemplate>
<table width="500px">
<tr>
<td>
<dx:ASPxComboBox ID="cmbCsvColumns" onchange="cmbCsvColumns_SelectedIndexChanged(this);"
runat="server" AutoPostBack="False">
</dx:ASPxComboBox>
</td>
</tr>
</table>
</ItemTemplate>
</asp:Repeater>
你的JavaScript应该是这样的:
var selectedValues = "";
function cmbCsvColumns_SelectedIndexChanged(obj)
{
if(selectedValues.indexOf(e.options[e.selectedIndex].value + ",") != -1)
{
alert("Your message");
}
else
selectedValues = selectedValues + e.options[e.selectedIndex].value + ",";
}
你必须稍微增强一下javascript方法,以避免像"11"中的"1"匹配这样的问题。
我在中继器中使用了asp:dropdown,在服务器端您可以实现它,例如:
protected void cmbCsvColumns_SelectedIndexChanged(object sender, EventArgs e)
{
string s = ((DropDownList)(sender)).ClientID;
for (int i = 0; i < rptTableMapper.Items.Count; i++)
{
DropDownList cmb = (DropDownList)(rptTableMapper.Items[i].FindControl("cmbCsvColumns"));
ListItem selectedItem = ((DropDownList)(sender)).SelectedItem;
if (cmb.ClientID != s)
{
foreach (ListItem li in cmb.Items)
{
if (li.Value == selectedItem.Value)
{
cmb.Items.Remove(li);
break;
}
}
}
}
}
您必须处理的是,如果未选择从下拉列表中删除的项目,则如何将其添加回其他下拉列表中。