【问题标题】:How to manage what to display in a gridview from a dropdown list?如何从下拉列表中管理要在网格视图中显示的内容?
【发布时间】:2013-11-08 15:06:52
【问题描述】:

第一次在这里发帖。

我在使用一个简单的 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>

【问题讨论】:

  • 您好,您的下拉列表有属性 AutoPostBack True?
  • @user2969391 你能显示网格视图和下拉列表设计视图吗?
  • @user2969391 DataSource 有数据吗?我的意思是您填写Persons 列表的位置
  • 是的,下拉列表具有自动回发 True。人员列表是静态的,我在页面加载时填写。
  • 您的 page_load 中有回发吗?

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


【解决方案1】:

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

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

编辑:

假设您想过滤 Persons 的其中一个名为 category 的属性,您可以过滤 List&lt;Person&gt;,例如,使用具有如下函数的 LINQ:

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

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

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

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

编辑#2

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

【讨论】:

  • 有没有机会详细说明如何使用 ddlPersons.SelectedValue 进行过滤?我在页面加载中发现了一个错误,这解决了我让 gridview 重新填充的问题。
  • 不确定您是否使用 LINQ;如果没有,只需遍历函数中的集合并检查要过滤的属性的值,然后构建要输出的列表。
  • @psudocoder 请注意,乞求点赞/声望通常会受到社区的反对。虽然不接受地址,但这是一个reference Post on Meta
  • @pseudocoder 既然他是新用户,他现在无论如何都不能投票,所以为什么不给他一个指向tour 页面或类似页面的链接,解释接受答案会有所帮助未来的访问者要找到正确的,而不是问... please upvote and/or mark the answer as correct.
  • @C5H8NNaO4 因为这是我认为合适且不希望改变的行为,我已经开始对其进行元 QA:meta.stackexchange.com/questions/204713/…
【解决方案2】:
 protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
          loadList();
          BindGrid();
        }
    }

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

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

【讨论】:

  • 我明白这也能起作用。恐怕我找到了解决问题的简单方法。我只是不明白我必须为数据源提供一个列表,而不是我想要绑定 gridview 的实际对象。我正在使用此处提供的示例来了解有关解决此问题的有效方法的更多信息。非常感谢您的时间和精力!
  • 1) 是什么让您认为Persons 是静态的? 2)当你可以访问底层数据源时,为什么要在gridview中过滤数据?
  • @pseudocoder 这是在 gridview 中过滤数据的一个选项,但我不喜欢这样,但正如我所说,创建单独的方法来使用 ddl 填充 gridview,我建议在其中进行查询以从 DB 中获取数据使用过滤器。
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多