将用户控件用作占位符内的行

时间:2013-09-26 01:30:52

标签: asp.net user-controls webforms asp.net-placeholder

我的页面中有一个asp占位符,我在其中动态插入“行”,其中每行都是用户控件。

如果请求是GET请求,我会从数据库加载数据并根据需要填充尽可能多的用户控件。我还将控件实例添加到会话内容中。

如果请求是POST请求,我首先通过查看Page_Load()内部的会话内容来重新创建控件。之后,每个按钮的处理程序可以执行任何需要完成的额外工作,例如添加新行(占位符,会话和数据库),删除行(来自占位符,会话和数据库)或更新现有的一行。

我在这里面临几个问题:

  1. 删除行时,有时删除后屏幕上会显示错误的数据,即使删除了右行。这很危险,因为对于进一步的删除,我们不知道哪些行会受到影响。
  2. 添加新行时,有时其中一个现有行将包含错误的数据(特别是来自另一个现有行的数据)
  3. 如何解决这些问题?我甚至很难诊断出这个问题。这些常见问题是什么?我这样做完全错了吗?有什么更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

我之前遇到过这样的问题。我修理了它们:

  • 在将用户控件放入之前实例化用户控件 占位符需要具有与回发前相同的ID (即当你第一次创建它时)。我做了类似"usr_" + <db record id>的事情。这确保了它的相同ID,无论它的顺序如何 加载,删除哪些记录等等。这可能是最多的 重要的是要做,因为如果你不指定ID的.NET会 为他们分配 - 并按照他们显示的顺序分配 在控制集合中,这意味着你可能会有 错误的用户控件中的错误信息(您在自己的控件中描述) 问题)。
  • 不使用会话来存储有关页面的信息。一旦ID 问题是固定的,如果开放,人们仍然有问题 同一页面的两个标签。

这些方面的东西:

using (SqlConnection c = new SqlConnection(DB_STRING))
{
    c.Open();
    String sql = @"
        SELECT *
        FROM yourTable
        ORDER BY ID;";
    using (SqlCommand cmd = new SqlCommand(sql, c))
    {
        using (SqlDataReader d = cmd.ExecuteReader())
        {
            while (d.Read())
            {
                UserControl uc = (UserControl)new UserControl().LoadControl("~/path/to-your-control/YourControl.ascx");
                uc.ID = "usr_" + d["ID"];
                plcHolderRows.Controls.Add(uc);
            }
        }
    }
}