2012-06-20 52 views
0

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

如果combobox1选择的值是'约翰史密斯'我需要从其他重复组合框中删除'约翰史密斯'。任何帮助?

<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) 
     { 

     } 
    } 
} 
+0

猜你忘了粘贴代码。 – gabsferreira

+0

该代码是基本的。中继器内的组合框! –

+0

cmbCsvColumns_SelectedIndexChanged代码请 –

回答

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方法一点一点地避免这样的匹配问题,“1”在“11”,

我用一个asp:直放站和服务器端的下拉菜单,你可以acheive它想:

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; 
        } 
       } 
      } 
     } 

    } 

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

+0

谢谢你Imran, 我想实现的是一个SQL - > csv表映射器,它将SQL列名称映射到CSV头文件中存在的等效列名称。您可以在SQL Server中找到一个类似的运行示例, 右键单击Management Studio中的数据库,然后单击导入数据,选择datasource as flatfile并选择CSV,然后选择一个现有表名并单击编辑映射,请参阅组合框。我相信我们可以做到没有JS。任何额外的信息来帮助这种困境? –

+0

我已经用服务器端代码更新了我的答案,请看看它。 –