2013-02-14 54 views
1

比方說,我有一個用戶控件與幾個按鈕。我想知道哪一個導致回發,使用這種方法:如何在自己的代碼中引用用戶控件?

public static Control GetPostBackControl(Page page) 
    { 
     Control control = null; 

     string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
     if (ctrlname != null && ctrlname != string.Empty) 
     { 
      control = page.FindControl(ctrlname); 
     } 
     else 
     { 
      foreach (string ctl in page.Request.Form) 
      { 
       Control c = page.FindControl(ctl); 
       if (c is System.Web.UI.WebControls.Button) 
       { 
        control = c; 
        break; 
       } 
      } 
     } 
     return control; 
    } 

這是怎麼了稱之爲:

string btn = GetPostBackControl(this.Page).ID; 

我得到了「對象未設置到一個對象的實例「我現在知道問題來自我使用this.Page,它代表父頁

如何引用我所在的用戶控件? (不是父頁面)所以它可以使用該方法來查找導致回發的按鈕?

感謝您的幫助。

編輯

這兩個按鈕都位於用戶控件內。 GetPostBackControl()也位於用戶控件的代碼隱藏之中。

+0

從我所看到的__EVENTTARGET具有完整的控件ID,因此可能類似於masterPage_ChildPage_UserControlParent_YourUserControl_ElementId。但是當你使用FindControl時,你只需要傳遞Element1來獲得控制權 – 2013-02-14 19:09:32

+0

你可以爲它寫一些代碼嗎? – Richard77 2013-02-14 19:12:47

+0

現在還有一些其他的東西,但是如果我的記憶是正確的,那麼你可能可以在下劃線上拆分並搜索最後一個數組元素。嘗試着在調試器中查看__EventTarget中的內容。如果在我回家的時候沒有想到這個,我會試着去演示一個演示 – 2013-02-14 19:16:25

回答

2

我在你的代碼上做了一個快速的例子,它工作得很好。也許你沒有錯過檢查Page.IsPostBack?顯然只會有一個postBackControl如果有一個回傳...

@Buttons - 它們將被呈現爲<input type="submit">,因此他們不會內___EVENTTARGET出現。這就是爲什麼瑞安Farlayhis blog

寫道:但是,你仍然可以得到它,只是以不同的方式。由於 按鈕(或輸入)是導致表單提交的原因,因此它將被添加到 表單集合中的項目以及來自 提交表單的所有其他值。 [...]如果你想 在表單集合中查看任何是按鈕的東西,那麼 將會是導致回發的原因(假定它是一個按鈕,導致頁面提交時爲 )。如果您首先檢查__EVENTTARGET,然後 如果是看空的Form集合在一個按鈕,那麼你會 找到是什麼原因導致的回傳

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
    { 
     Control postBackControl = GetPostBackControl(this.Page); 
     Debug.WriteLine("PostBackControl is: " + postBackControl.ID); 
    } 
} 
public static Control GetPostBackControl(Page page) 
{ 
    Control control = null; 

    string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
    if (ctrlname != null && ctrlname != string.Empty) 
    { 
     control = page.FindControl(ctrlname); 
    } 
    else 
    { 
     foreach (string ctl in page.Request.Form) 
     { 
      Control c = page.FindControl(ctl); 
      if (c is System.Web.UI.WebControls.Button) 
      { 
       control = c; 
       break; 
      } 
     } 
    } 
    return control; 
} 
+0

謝謝。這個問題是我在控制中遇到的一個更大問題的一部分,我無法在後面的代碼中看到它。當頁面回發時,控件不保留它的值。爲此,我只會發佈一個新問題。 – Richard77 2013-02-14 19:51:58

相關問題