簡體   English   中英

在占位符內將用戶控件用作行

[英]Using a user control as a row inside a placeholder

我的頁面中有一個asp占位符,並在其中動態插入“行”,其中每一行都是一個用戶控件。

如果請求是GET請求,則從數據庫加載數據,並根據需要填充盡可能多的用戶控件。 我還將控件實例添加到會話內容中。

如果請求是POST請求,則我首先通過查看Page_Load()內部的會話內容來重新創建控件。 之后,每個按鈕的處理程序都可以做任何需要做的額外工作,例如添加新行(到占位符,會話和數據庫),刪除行(從占位符,會話和DB)或更新現有行。

我在這里面臨幾個問題:

  1. 刪除行時,即使刪除了右行,有時在刪除后屏幕上也會顯示錯誤的數據。 這很危險,因為對於進一步的刪除,我們不知道哪些行會受到影響。
  2. 添加新行時,有時現有行之一中的數據錯誤(特別是來自另一現有行的數據)

我該如何解決這些問題? 即使診斷問題,我也很難。 這些是常見問題嗎? 我只是在做這件事完全錯誤嗎? 有什么更好的方法可以做到這一點?

我以前遇到過這樣的問題。 我通過以下方式修復了它們:

  • 在將用戶控件放入占位符之前實例化用戶控件時,它需要具有與回發之前(即,首次創建它時)相同的ID。 我做類似"usr_" + <db record id> 不管加載順序如何,刪除哪些記錄等等,這都可以確保其ID相同。這可能是最重要的事情,因為如果您不分配ID,.NET就會為您分配ID。它們是按照它們在控件集合中顯示的順序分配的,這意味着您可能在錯誤的用戶控件(您在問題中進行了描述)中獲得了錯誤的信息。
  • 不使用會話存儲有關頁面的信息。 一旦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);
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM