Лично я держусь подальше от выполнения подобных операций в разметке ASP. Поэтому я не уверен, что вы можете связать свой полный список книг и выбрать книги для каждого клиента только в разметке - конечно, свойство SelectedValue не способ сделать это.
Вот как бы я сделал что-то вроде этого:
Markup:
<asp:GridView ID="customers" DataKey="CustomerId">
<Columns>
<asp:TemplateField>
<ItemTemplate><%# Eval('age') %></ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate><%# Eval('name') %></ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:Listbox ID="books" DataSourceId="availableBooks" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Код-за:
protected override OnInit(EventArgs e)
{
base.OnInit(e);
customers.RowDataBound += new GridViewRowEventHandler(customers_RowDataBound);
}
void customers_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
Customer currentCustomer = (Customer) e.Row.DataItem;
Listbox books = (ListBox) e.Row.FindControl("books");
books.DataSource = GetBooksCollection();
books.DataBind();
foreach (BooksPurchased currentBook in currentCustomer.booksCollection)
{
if (books.Contains(currentBook))
{
books.Selected = true;
}
}
}
}
Этот код не симпатичен, и ему необходимо заполнить некоторые детали (например, структуру объекта BooksPurchased), но он должен помочь вам правильно выбрать книги, выбранные каждым клиентом.
Немного сложнее управлять добавлением и удалением книг, когда пользователь выбирает различные элементы в ListBox, и каждый параметр зависит от деталей реализации (например, как вы храните клиента, если вообще его выполняете? база данных, или кеширование меняется, пока пользователь не нажмет кнопку отправки?). Если вы можете предоставить более подробную информацию об этой части, я мог бы помочь и с ней.