【问题标题】:Databound repeater nested in GridView will not update嵌套在 GridView 中的数据绑定转发器不会更新
【发布时间】:2011-10-28 16:25:37
【问题描述】:

我有一个 Repeater 嵌套在 GridView 内。在GridViewRowDataBound 事件上,我设置DataSource(基于行的列之一),然后绑定Repeater。这适用于初始加载,但是我需要能够动态地将新项目添加到 Repeater

我将一个项目附加到DataSource,将其保存到ViewState,在我通常使用方法调用绑定的地方,我改为绑定到保存到ViewState 的对象。 DataSouce 反映了更改,但页面没有。

我错过了什么?我在另一个没有嵌套的页面上有完全相同的设置,并且效果很好。

if (ViewState["RepeaterObj"]!=null)
{
   rpt.DataSource=(IList<DataTransferObject>)ViewState["RepeaterObj"];
}
else
{
   rpt.DataSource = controller.GetObj(param);
   rpt.DataBind();
}

【问题讨论】:

  • 如果我正确理解您的编辑,并且您对您的问题有答案,请将其作为答案发布并接受。

标签: c# asp.net data-binding repeater databound-controls


【解决方案1】:

我最终通过完全停止使用ViewState 解决了这个问题,尽管我认为我的临时DataSource 会在postback 中丢失,但事实并非如此。我最终选择了一个完美的班级级别variable。看来我没有正确理解postback 期间发生的事情。

【讨论】:

    【解决方案2】:

    首先,您不应该在 ViewState 中存储数据源。这几乎是你能放的最糟糕的地方。

    至于您的问题,我建议在将新项目添加到转发器时重新绑定 GridView,或者在保存新记录的事件中找到转发器并在那里重新绑定。

    【讨论】:

    • 它实际上并不是一个实质性的DataSource,只是一个具有唯一标识符的标签列表。我暂时使用ViewState,直到用户实际保存他们的编辑。为了添加一个新的空白项目,我必须将转发器重新绑定到一个临时列表。除非你有更好的主意?
    【解决方案3】:

    我认为问题在于您没有重新绑定Repeater。您说您更改了绑定方式以查看 ViewState 对象,但您实际上是否触发了 Bind 发生?听起来您不是,页面只是使用控件的ViewState 存储的当前数据重新加载。

    确保您明确调用 Repeaters 绑定事件以确保它正在反弹。

    编辑:我怀疑它可能需要重新绑定 GridView 而不仅仅是 Repeater

    【讨论】:

    • 我明确地调用中继器的绑定事件。正如我提到的,它与初始页面加载几乎相同的代码,只是使用不同的数据源。当使用方法返回数据源而不是从视图状态中拉取数据源时,绑定会以任何一种方式发生并且正常工作。
    • @9ball 你确定你的旧绑定方法在你显式绑定之后没有被执行吗?在代码上放一个断点,然后查看旧绑定是否发生。
    • 两个绑定在一个if语句上,只有一个执行。
    • 我想我确实需要重新绑定GridView,但我不确定如何在不发生无限循环的情况下执行此操作
    • @9ball 需要重新加载这个Repeater 所以绑定整个网格然后在你的Repeater OnDataBinding 做你的绑定并寻找ViewState 数据特定行。我更喜欢不使用RowDataBound 事件并在控件级别使用OnDataBinding 实现数据绑定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    相关资源
    最近更新 更多