如何从下拉列表中管理在gridview中显示的内容?

时间:2013-11-08 15:06:52

标签: c# asp.net gridview drop-down-menu

第一次在这里发帖。

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

我可以将gridview绑定到ddl,它将显示ddl的所有项目中包含的信息。但我不知道我的生活如何在gridview中显示所选对象信息。

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

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

(人是我所证实含有,我所需要的信息的对象的列表中,标签被简单地存在,以查看是否该方法的火灾。它也确实但数据绑定不会。)

我已尝试过stackoverflow的许多不同答案,但似乎没有一个对我的项目起作用,我完全不知道该怎么办。

更新 继承我的页面加载。在方法loadList()中填写人员列表。它的内容不会改变。

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

至于使用ddlPersons.SelectedItem来过滤哪些内容,我不知道如何完成。我的意思是我尝试使用不同的方式来访问所选对象,但仍然不成功。

更新2

gridview和下拉列表的标记

<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>

2 个答案:

答案 0 :(得分:2)

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

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

修改

假设你想要在其名为category的一个属性上过滤Persons,你可以使用带有这样功能的LINQ来过滤List<Person>

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

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

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

说了这么多,假设您的集合PersonsList<T>,并且还要记住上面的解决方案将从数据库加载整个结果集并过滤列表中的网络服务器的记忆。如果您的数据检索函数返回IQueryable<T>,则可以稍微修改上述函数以使数据库查询更有效。如果你对此感兴趣,请告诉我。

编辑#2

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

答案 1 :(得分:1)

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

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

请注意,因为您已将Person保持为静态且其值永远不会更改,并且您在Person事件中已将gridview数据源提供为ddlPersons_SelectedItemChanged。因此,您的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.
   }