中继器中的组合框,独特的选择



我在数据中继器中有一个组合框,我需要从其余重复的组合框中删除组合框的选定值,以便我可以禁止在多个组合框中多次选择相同值:

如果组合框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;
                    }
                }
            }
        }
    }

您必须处理的是,如果未选择从下拉列表中删除的项目,则如何将其添加回其他下拉列表中。

最新更新