在GridView绑定后获取GridView中的项目

时间:2011-10-02 15:36:57

标签: c# .net gridview user-controls postback

我有一个UserControl AutomatedFeedGridView.ascx,它本质上是一个GridView。它有一个公共属性Category,它使用控件传递到页面上。

我遇到的问题是我想根据调用页面上的下拉列表进行过滤。

以下是AutomatedFeedGridView控件的代码隐藏:

// The feed category
public Feeds.FeedCategory Category { get; set; }


protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        List<AutomatedFeed> x = Feeds.GetAutomatedFeed(Category);
        gvAutomatedFeed.DataSource = x;
        gvAutomatedFeed.DataBind();
    }

    else
    {
        List<AutomatedFeed> x = (List<AutomatedFeed>)gvAutomatedFeedCategory.DataSource;

        foreach (AutomatedFeed y in x)
        {
            // if condition is not met, hide y
        }
    }

因此,在第一次加载时,GridView绑定到AutomatedFeed个对象的List。在任何后续调用(由包含控件的页面上的回发引起)我想运行一些代码来过滤掉GridView中的一些项目。问题是这一行:

List<AutomatedFeed> x = (List<AutomatedFeed>)gvAutomatedFeedCategory.DataSource;

我已经尝试了所有解决方案here,但它们似乎都没有工作,我总是得到对象引用未设置为实例错误。我错过了什么,或者我是以完全错误的方式做到这一点?

我知道我可以轻松地再次拨打Feeds.GetAutomatedFeed(Category)但是必须有更好的方法来进行另一个存储过程调用吗?

2 个答案:

答案 0 :(得分:1)

您可以将会话中的数据源存储为Session["x"] = x ;

当页面回发时将其检索回List<AutomatedFeed> x = List<AutomatedFeed>)Session["x"];

<强>更新

除非您在每次回发时显式重新分配并重新绑定它,否则DataSource属性将为null。

您可以使用Session,Cache或ViewState来保留DataSource。但它需要更多的记忆。

答案 1 :(得分:0)

控件仅在page.load之后生成并填充,因此它不包含任何数据。