Combobox中继器,独特选择

时间:2012-06-20 12:26:42

标签: c# asp.net combobox

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

如果combobox1选择的值是'john smith',我需要从其他重复的组合框中删除'john smith'。有什么帮助吗?

<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 个答案:

答案 0 :(得分:0)

我不确定如果这是您的业务要求或者我的建议不是从下拉列表中删除条目。 让我们说在第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;
                    }
                }
            }
        }

    }

你需要处理的是,如果从下拉列表中删除的项目未被选中,而不是如何将其添加回其他下拉列表中。