0

データリピーター内にコンボボックスがあります。コンボボックスの選択された値を残りの繰り返されるコンボボックスから削除する必要があるため、複数のコンボボックスで同じ値を複数選択することを禁止できます。

コンボボックス 1 の選択値が「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)
        {

        }
    }
}
4

1 に答える 1

0

それがあなたのビジネス要件なのかどうかはわかりませんが、ドロップダウンからエントリを削除しないことをお勧めします. 行 1 でユーザーが値 1 を選択すると、値 1 が残りの行の他のドロップダウンから削除され、行 2 でユーザーが値 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 + ",";

}

「11」の「1」の一致などの問題を回避するために、JavaScript メソッドを少し強化する必要があります。

リピーターで 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;
                    }
                }
            }
        }

    }

あなたがそれを処理しなければならないことは、ドロップダウンから削除されたアイテムが選択されていない場合、それを他のドロップダウンに戻す方法よりも.

于 2012-06-20T13:23:51.737 に答える