我有一个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)
但是必须有更好的方法来进行另一个存储过程调用吗?
答案 0 :(得分:1)
您可以将会话中的数据源存储为Session["x"] = x ;
当页面回发时将其检索回List<AutomatedFeed> x = List<AutomatedFeed>)Session["x"];
<强>更新强>
除非您在每次回发时显式重新分配并重新绑定它,否则DataSource属性将为null。
您可以使用Session,Cache或ViewState来保留DataSource。但它需要更多的记忆。
答案 1 :(得分:0)
控件仅在page.load之后生成并填充,因此它不包含任何数据。