启用Multiselect时,使用ObjectDataSource绑定Listbox / CheckedListBox的SelectedValue

时间:2011-09-27 11:57:03

标签: c# asp.net gridview

我目前没有代码以最佳方式解释我的问题。因此可能存在一些语法错误,可能会留下一些与数据源相关的绑定。

情景。

我有一个类作为Customer,包含一些属性

例如

class Customer
{
          int CustomerId{get;set;} //primary key
          int age{get;set;}
          string name{get;set;}
          Collection<BooksPurchased> booksCollection{get;set;}
} 

我使用了一个函数来说GetCustomer()返回Collection

public Collection<Customer> GetCustomer();

此函数使用ObjectDataSource控件与GridView绑定。

<asp:GridView DataKey="CustomerId">
<columns>
<asp:TemplateField>
     <ItemTemplate><%# Eval('age') %></ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
     <ItemTemplate><%# Eval('name') %></ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
     <ItemTemplate>
             <asp:Listbox DataSourceId="availableBooks" SelectedValue='<%# Bind("booksCollection") %>' />
             <asp:ObjectDataSource SelectMethod="GetBooksCollection" TypeName="Books">   
     </ItemTemplate>
</asp:TemplateField>
   </Columns>
</asp:GridView>

此Grid再次绑定到ObjectDataSource控件,该控件表GetCustomer()函数绑定网格。

问题  我想显示/更新和列表框控件中绑定的所有选定项目。 即如果Listbox有10个项目,booksCollection包含3个项目。 然后这3个项目应显示为选中。当用户chages选择时,这些应该反映在集合本身中。

1 个答案:

答案 0 :(得分:1)

就个人而言,我远离在ASP标记中执行此类操作。因此,我不确定您是否可以绑定完整的书籍列表并仅为标记中的每个客户选择书籍 - 当然,SelectedValue属性不是这样做的方法。

以下是我将如何做这样的事情:

标记:

<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中选择不同的项目时,管理添加和删除书籍会有点复杂,每个选项都取决于实现细节(例如:如何存储客户,如果有的话?你是否立即更新数据库或缓存更改,直到用户单击提交按钮?)。如果您可以提供有关此部分的更多详细信息,我也可以提供帮助。