0

我在 detailsview 中有我自己的 selectedvalue 属性的 Listbox。当我设置 Appenddatabounditems="true" 时,Listbox 的值被重复,否则我设置 "AppendDatabounditems="false" 然后 Listbox selectedvalue 不起作用。

请建议我,如何避免列表框中的重复。

我的代码片段如下。

[ASPX 页面]

'<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">'
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
 <asp:ListBox ID="sd" runat="server"></asp:ListBox>
<asp:ScriptManager ID="scriptManager1" runat="server" />
 <asp:DetailsView ID="dvProfile" runat="server" AutoGenerateRows="False" DataSourceID="odsProfileData">
    <Fields>
        <asp:BoundField DataField="FullName" HeaderText="Full Name" HeaderStyle-Width="100px" />
        <asp:TemplateField HeaderText="Products">
            <ItemTemplate>
                <iac:MyMultiSelectionDropDown ID="ListBox1" OnDataBound="Databound" runat="server"
                    DataSourceID="odsProducts" DataTextField="FullName" DataValueField="ID" AppendDataBoundItems="true"
                    SelectionMode="Multiple" SelectedValuesCSV='<%# Bind("Products") %>'>
                </iac:MyMultiSelectionDropDown>
            </ItemTemplate>
            <EditItemTemplate>
                <iac:MyMultiSelectionDropDown ID="ListBox1" OnDataBound="Databound" runat="server"
                    DataSourceID="odsProducts" DataTextField="FullName" DataValueField="ID" AppendDataBoundItems="true"
                    SelectionMode="Multiple" SelectedValuesCSV='<%# Bind("Products") %>'>
                </iac:MyMultiSelectionDropDown>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ButtonType="button" ShowEditButton="true" EditText="Edit User Profile" />
    </Fields>
</asp:DetailsView>
 <asp:ObjectDataSource ID="odsProfileData" runat="server" SelectMethod="GetProfileData"
    TypeName="MultiSelectionTest.App_Code.TestData" />
<asp:ObjectDataSource ID="odsProducts" runat="server" SelectMethod="GetProducts"
    TypeName="MultiSelectionTest.App_Code.TestData" />

[测试数据.CS]

//使用这个类文件我填充了ListBox。

public class TestData
{
    public List<ProfileData> GetProfileData()
    {
        List<ProfileData> ret = new List<ProfileData>();
        ret.Add(new ProfileData("Test1", "1,2"));
        return ret;
    }
    public List<Product> GetProducts()
    {

        List<Product> ret = new List<Product>();
        ret.Add(new Product(1, "Product1"));
        ret.Add(new Product(2, "Product2"));
        ret.Add(new Product(3, "Product3"));
        ret.Add(new Product(4, "Product4"));
        return ret;
    }

    public class ProfileData
    {
        public ProfileData(string fullName, string products)
        {
            FullName = fullName;
            Products = products;
        }
        public string FullName { get; set; }
        public string Products { get; set; }
    }
    public class Product
    {
        public Product(int id, string fullName)
        {
            ID = id;
            FullName = fullName;
        }
        public int ID { get; set; }
        public string FullName { get; set; }
    }

}

[MyMultiselectionDropDown.cs]

//使用这个类文件我得到了SelectedValues。

 public class MyMultiSelectionDropDown : ListBox
{
    private bool _noUpdate = false;

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public string SelectedValuesCSV
    {
        get
        {
            string ret = string.Empty;
            foreach (System.Web.UI.WebControls.ListItem li in this.Items)
            {
                if (li.Selected)
                {
                    ret += "," + li.Value.ToString();
                }
            }
            return ret.TrimStart(',');
        }
        set
        {
            if (!_noUpdate)
            {
                _noUpdate = true;
                this.DataBind();

            }
            _noUpdate = false;

            IdContainer values = new IdContainer(value);
            foreach (string val in values)
            {
                System.Web.UI.WebControls.ListItem li = this.Items.FindByValue(val);
                if (li != null)
                    li.Selected = true;
            }
        }
    }
}

请给我建议。

问候, Sunil Prabakar C

4

1 回答 1

0

嘿 Sunil,我认为当您AppendDataBoundItems通过设计器代码获得下拉列表的属性时,您需要为相同的 ex 添加默认列表项,例如<asp:ListItem Text="(Select a State)" Value="" />.

我已经修改了您的代码,请使用相同的代码。

<ItemTemplate>
            <iac:MyMultiSelectionDropDown ID="ListBox1" OnDataBound="Databound"  runat="server"
                DataSourceID="odsProducts" DataTextField="FullName" DataValueField="ID"   AppendDataBoundItems="true"
                SelectionMode="Multiple" SelectedValuesCSV='<%# Bind("Products") %>'>
                <iac:ListItem Text="(Please Select)" Value="" />   
             </iac:MyMultiSelectionDropDown>
        </ItemTemplate>

如需进一步调查,请参阅链接参考链接

希望它会帮助你。

于 2013-06-11T07:42:54.557 回答