2017-07-25 63 views
0

每當DropDownList SelectedIndexChanged,我將LinkBut​​tons添加爲代碼隱藏中的ul-li列表。每個鏈接按鈕都分配了ID和常見的Click事件。問題是Click事件中的代碼未被執行或者事件未被觸發。我下面的代碼:[編輯]我想這樣的其他職位(dynamically created list of link buttons, link buttons not posting back動態創建linkbuttons的公共事件不會觸發

protected void ddl_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    populate(); 
} 

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    populate(); 
} 

void populate() 
{ 
    HtmlGenericControl ulList = new HtmlGenericControl("ul"); 
    panel.Controls.Add(ulList); 

    foreach (DataRow dr in drc) 
    { 
     HtmlGenericControl liList = new HtmlGenericControl("li"); 
     ulList.Controls.Add(liList); 

     var lnk = new LinkButton(); 
     lnk.ID = dr["col1"].ToString(); 
     lnk.Text = dr["col1"].ToString(); 
     lnk.Click += Clicked; 
     liList.Controls.Add(lnk); 
    } 
}    

private void Clicked(object sender, EventArgs e) 
{ 
    var btn = (LinkButton)sender; 
    label1.Text = btn.ID.ToString(); 
} 

林失去了一些東西建議。請任何幫助。

+0

這些事件不會在回發中綁定。 –

+0

回發時運行代碼。查看編輯... – Tres

+0

@Daniel請參閱編輯。仍然點擊的活動沒有開火。 – Tres

回答

0

這裏的問題是ViewState。當dropdownlist的選定索引發生變化時,會出現postback,並且之前的狀態將丟失,因此此時您必須保持控件的狀態。

現在在您的代碼中,實際上控件的狀態會丟失,因此click event不會觸發。所以解決方案是維護控件的狀態。

下面是一個工作示例,您可以將其粘貼並嘗試。

這是我的page load

protected void Page_Load(object sender, EventArgs e) 
     { 
      for (var i = 0; i < LinkButtonNumber; i++) 
       AddLinkButton(i); 
     } 

同樣,你必須保持以前添加的控件的狀態,像這樣。下面

private int LinkButtonNumber 
     { 
      get 
      { 
       var number = ViewState["linkButtonNumber"]; 
       return (number == null) ? 0 : (int)number; 
      } 
      set 
      { 
       ViewState["linkButtonNumber"] = value; 
      } 
     } 

是我SelectedIndexChangedEventDropDownList

protected void Example_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      AddLinkButton(LinkButtonNumber); 
      LinkButtonNumber++; 
     } 

我有一個動態創建的控件,這就是所謂的頁面加載和SelectedIndexChanged功能。

private void AddLinkButton(int index) 
     { 
      LinkButton linkbutton = new LinkButton { ID = string.Concat("txtDomain", index) }; 
      linkbutton.ClientIDMode = ClientIDMode.Static; 
      linkbutton.Text = "Link Button "; 
      linkbutton.Click += linkbutton_Click; 
      PanelDomain.Controls.Add(linkbutton); 
      PanelDomain.Controls.Add(new LiteralControl("<br />")); 
     } 

這是Click eventLinkButton

void linkbutton_Click(object sender, EventArgs e) 
     { 
      //You logic here 
     } 
+0

我會試試看,並會回覆你... – Tres

+0

我看到你的問題並準備好了解決方案。 @Tres –

+0

我的不好,不能使用你的代碼。我的框架仍然是3.5。對不起 – Tres

0

我解決它使用蠻力代碼笑。 由於控件的事件未在回發中綁定,我們在回發中重新創建它們。所以在我的Page_Load中,我調用了重新創建控件的模塊,從而將它們綁定到相應的事件。這個工程,但...

重新創建這些控件創建重複項(Multiple Controls with same ID were found),你會遇到麻煩的情況下找到一個ID控制像使用panel.FindControl。 爲了彌補這種情況,我再次檢查在重新創建它們之前是否已經存在相同的控件ID,瞧!有用。

protected void Page_Load(object sender, EventArgs e) 
{ 
    populate(); 
} 

void populate() 
{ 
    HtmlGenericControl ulList = new HtmlGenericControl("ul"); 
    panel.Controls.Add(ulList); 

    foreach (DataRow dr in drc) 
    { 
     HtmlGenericControl liList = new HtmlGenericControl("li"); 
     ulList.Controls.Add(liList); 

     if (liList.FindControl(dr["col1"].ToString()) == null) 
     { 
      var lnk = new LinkButton(); 
      lnk.ID = dr["col1"].ToString(); 
      lnk.Text = dr["col1"].ToString(); 
      lnk.Click += Clicked; 
      liList.Controls.Add(lnk); 
     } 
    } 
} 
相關問題