【问题标题】:Repeater Loses it's data on PostBacks中继器丢失其在 PostBacks 上的数据
【发布时间】:2011-07-30 23:59:57
【问题描述】:

重复标记:

<asp:Repeater ID="stat_Rptr" runat="server">
                <ItemTemplate>
                    <asp:CheckBox ID="IsSelected_ChkBx" runat="server" Text='<%# Eval("Item") %>' />
                    &nbsp;<asp:TextBox ID="Value_TxtBx" runat="server"></asp:TextBox>
                    <asp:HiddenField ID="ID_HdnFld" runat="server" Value='<%# Eval("ID") %>' />
                </ItemTemplate>
                <SeparatorTemplate>
                    <br></br>
                </SeparatorTemplate>
            </asp:Repeater>

代码隐藏:

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


    private void PopulateStatRptr()
    {
        SqlConnection conn;
        SqlCommand comm;
        SqlDataReader reader;

        string _connString = "Data Source=localhost\\SqlExpress;Initial Catalog=MyDb;Integrated Security=True";

        conn = new SqlConnection(ConString);
        comm = new SqlCommand("SELECT ID, Item FROM Stats", conn);

        try
        {
            conn.Open();
            reader = comm.ExecuteReader();
            stat_Rptr.DataSource = reader;
            stat_Rptr.DataBind();
            reader.Close();
        }

        finally
        {
            conn.Close();
        }
    }

【问题讨论】:

  • 有趣的分隔符选择。为什么不只是&lt;br/&gt;
  • 相信我,这不是视觉上的安慰。
  • 刚刚在开发阶段,是给我的:)

标签: c# asp.net webforms


【解决方案1】:

好吧,看来Repeater是一个动态控件。如果您在代码隐藏中绑定,您必须意识到 itemtemplate 中的文本框和复选框在 DataBind() 之前不存在。如果您禁用视图状态,除非您在每次页面加载时进行数据绑定,否则您将看不到它们。在这种情况下,您将从视图状态中获取您的值。

检查这个link

【讨论】:

  • 谢谢,这成功了,转发器控件和数据是持久的..虽然这意味着每次回发时数据都会绑定!
  • 每次回发都绑定数据是完全可以的。你应该禁用视图状态,除非你真的需要它。通常页面上有几个不需要视图状态但会产生开销的控件。单个数据库调用有时比打开视图更好,具体取决于页面和数据库调用性能。
  • 其实这个页面的功能是创建一个item..这个item有很多属性,每组属性都在一个类别下(我把它们放在Divs中),我用按钮来显示那些divs..所以我可能需要去第一个 div,然后去第三个,然后回到第一个编辑或添加一些东西,最后保存..所以我认为 ViewState 在这里是必不可少的.. 数据库调用也很多,因为我需要检索控件中的所有数据并将它们保存到我的 Db 中的多个表中
  • Viewstate 与任何事情无关,除非您将数据发回。在页面中移动(直到您最终单击保存),不会影响视图状态。我不确定您的确切要求,但您可能应该创建一个对象(取决于它作为业务对象是否有意义)来保存整个项目并将其作为序列化 xml 发送到数据库。关于如何在sql中处理xml,这里有一个链接,stackoverflow.com/questions/2756773/c-send-xml-to-sql
  • 这是一个示例: Div1:个人信息 Div2:技能 N.B 我通过 2 个按钮在 2 个 div 中导航,显示我需要的一个并隐藏其他 div。现在两个div都包含输入一些相关数据的控件,我可能只是在第一个div中输入我的名字然后去第二个div添加一个技能,我需要回到第一个div继续我的个人信息..这个切换会发生很多,所以我需要在控件中保持信息持久化,所以如果我从一个 div 切换到另一个,我不想丢失我首先输入的数据。我希望你有要求:)
【解决方案2】:

在 Page_Init 而不是 Page_Load 上绑定。

【讨论】:

  • 对不起,我该如何创建 Page_Init 处理程序?
  • protected void Page_Init(object sender, EventArgs e)
  • 我在 coder net 的答案 (OnInit) 中使用了这篇文章并使用了你的,两者都非常好,但我不知道是否有任何区别! ..+1 谢谢,如果您有任何进一步的说明,那就太好了:)
【解决方案3】:

摆脱if (!IsPostBack) 代码并每次都调用您的函数。

【讨论】:

  • 好的,这将解决问题,但我认为绑定每个 PostBack 并不好,而且我正在以相同的方式绑定 4 个 CheckBoxList,并且我从 Page_Load 中调用它们的方式相同 if (!IsPostBack) 条件,它工作正常! ..这很奇怪
  • @IKashef - 实际上,在每次回发时绑定通常是个好主意。我们通常认为数据库查询的性能代价很高(而且确实如此),但你知道什么更昂贵吗?从半个国家上传一个大的视图状态。即使是快速的宽带连接通常也具有相对较慢的上行速度,即使实际呈现时间快如闪电,额外的延迟也会使您的页面看起来变慢。当然,如果这是仅用于本地 LAN 的 Intranet 页面,则例外。
  • 您的评论是有道理的 +1 .. 但问题是我只获得 CheckBox.Text、HiddenField.Value 的值 .. 但是当我单击保存按钮时,我需要检索 TextBox .Text 和 CheckBox.Checked 值并将它们存储在我的数据库中.. 这样我的转发器会重置所有内容,因此无论如何我的控件中新输入的数据都会丢失!
  • @Joel 很容易将 ViewState 保留在服务器上,因此这与问题无关。数据库查询的结果可以缓存或存储在会话中,以便在每个 Page_Load 上启用数据绑定。
  • @Peter .. 对不起,我失去了你! .. 您能否重新表述一下应该做什么或如何使用数据库进行数据绑定?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多