私は自分のselectedvalueプロパティを持つ詳細ビュー内にリストボックスを持っています.Appenddatabounditems = "true"を設定すると、リストボックスの値が複製されます。
リストボックスでの重複を避ける方法を教えてください。
私のコードスニペットは次のとおりです。
【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" />
[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