【问题标题】:Using a user control as a row inside a placeholder将用户控件用作占位符内的一行
【发布时间】:2013-10-01 19:25:40
【问题描述】:

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

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

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

我在这里面临几个问题:

  1. 删除行时,有时即使删除了正确的行,删除后屏幕上也会显示错误的数据。这很危险,因为对于进一步的删除,我们不知道哪些行会受到影响。
  2. 添加新行时,有时其中一个现有行会包含错误数据(特别是来自另一现有行的数据)

如何解决这些问题?我什至很难诊断问题。这些是常见问题吗?我只是这样做完全错误吗?有什么更好的方法可以做到这一点?

【问题讨论】:

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


    【解决方案1】:

    我以前也遇到过这样的问题。我通过以下方式修复了它们:

    • 当您在将用户控件放入 占位符,它需要具有与回发之前相同的 ID (即当你第一次创建它时)。我做了类似"usr_" + <db record id> 的事情。这确保了无论它的顺序如何,它的 ID 都是相同的 被加载,哪些记录被删除等等。这可能是最 重要的事情要做,因为如果你不给它分配 ID 的 .NET 将 为您分配它们——它们是按照它们显示的顺序分配的 在控制集合中,这意味着您可能会拥有 错误用户控件中的错误信息(您在 问题)。
    • 不使用会话来存储有关页面的信息。一旦身份证 问题已解决,如果打开,人们仍然有问题 同一页面的两个选项卡。

    类似的东西:

    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);
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 2013-06-24
      • 2013-07-18
      • 2015-12-11
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多