2

第一次在这里发帖。

我在一个简单的 web 应用程序中遇到了一个特定问题,我陷入了将 gridview 绑定到下拉列表并在 ddl 中显示所选项目的内容的问题。

我可以很好地将gridview绑定到ddl,它会显示包含在ddl的所有项目中的信息。但我一生都无法弄清楚如何在网格视图中显示选定的对象信息。

而且我也无法从 ddl 的 onSelectedItemChanged 重新触发数据绑定。

    protected void ddlPersons_SelectedItemChanged(object sender, EventArgs e)
    {
        Label1.Text = "message";
        this.GridView1.DataSource = Persons;
        this.GridView1.DataBind();
    }

(Persons 是我已确认包含我需要的信息的对象列表。标签只是用来查看方法是否触发。它也可以,但数据绑定不会。)

我从stackoverflow尝试了许多不同的答案,但似乎没有一个对我的项目有效,我完全不知道我应该做什么。

更新 了我的页面加载。在 loadList() 方法中,我填写了 Persons 列表。它的内容不会改变。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
        loadList();
        }
    }

至于使用 ddlPersons.SelectedItem 过滤哪些内容,我不知道这是怎么做的。我的意思是我已经尝试使用不同的方式来访问选定的对象,但仍然不成功。

更新 2

gridview 和 dropdownlist 的标记

<asp:GridView ID="GridView1" runat="server">
    <Columns>
        <asp:TemplateField HeaderText ="Nr">
            <ItemTemplate>
                <%# DataBinder.Eval(Container, "DataItem.getSetFirstName") %>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText ="Namn">
            <ItemTemplate>
                <%# DataBinder.Eval(Container, "DataItem.getSetFirstName") %>
                <%# DataBinder.Eval(Container, "DataItem.getSetLastName") %>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText ="Ålder">
            <ItemTemplate>
                <%# DataBinder.Eval(Container, "DataItem.getSetAge") %>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

 <asp:DropDownList ID="ddlPersons" runat="server" OnSelectedItemChanged="ddlPersons_SelectedItemChanged" AutoPostBack="True" OnSelectedIndexChanged="ddlPersons_SelectedItemChanged">
</asp:DropDownList>
4

2 回答 2

2

由于您是手动绑定 GridView,因此您需要使用ddlPersons.SelectedValue来过滤Persons集合的内容。

至于为什么你的 GridView 没有填充,这不是你发布的代码的问题。您可能希望包含您的 GridView 和 DropDownList 标记以及您用于填充的任何代码Persons

编辑:

假设您要过滤Persons其名为 category 的属性之一,您可以过滤一个List<Person>例如,使用具有如下函数的 LINQ:

private List<Person> FilterPersonsByCategory(List<Person> liPersons, string strCategory)
{
    return liPersons.Where(p => p.Category = strCategory);
}

然后你可以使用这样的函数:

GridView1.DataSource = FilterPersonsByCategory(Persons, ddlCategory.SelectedValue);

说了这么多,这是假设您的集合Persons是 a List<T>,并且请记住,上述解决方案将从数据库加载整个结果集并过滤 Web 服务器内存中的列表。如果您的数据检索函数返回IQueryable<T>,可以对上面的函数稍作修改,以使 DB 查询更高效。如果你对此感兴趣,请告诉我。

编辑#2

我找不到参考文档,但是如果内存服务GridView.DataSource需要一个实现IEnumerable接口的对象,那么该DataBind()进程可以获得一个枚举器对象来迭代数据。根据您的评论,这似乎是问题的一部分。

于 2013-11-08T15:11:45.553 回答
1
 protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
          loadList();
          BindGrid();
        }
    }

Public void BindGrid()
   { 
   // Code to Bind Gridview.
   }

请参阅,因为您将您的 as 保持Person为静态,并且它的值永远不会改变,并且您PersonddlPersons_SelectedItemChangedevent 中提供了您的 gridview 数据源。所以您的 gridview 内容不会更改。

2 . 过滤掉值您可以在RowDataBound事件上做一件事,您可以隐藏所有其他行接受与您的 dropdown.SelectedValue 相关的行。

或者创建不同的方法来填充您的 gridview 。

 protected void ddlPersons_SelectedItemChanged(object sender, EventArgs e)
    {
        //Label1.Text = "message";
        //this.GridView1.DataSource = Persons;
       // this.GridView1.DataBind();
       int ddlVal = Convert.toint32(ddlPersons.SelectedValue);
       BindGridUsingDdl(ddlVal); 
    }

 Public void BindGridUsingDdl(int ddlVal)
   {
      //Your code to populate gridview 
       // Gridview.Datasource = filter your list according 
      // to selected value of dropdown.
   }
于 2013-11-08T16:08:55.743 回答