2017-07-25 19 views
0

DropDownList SelectedIndexChangedを押すたびに、コードビハインドにul-liリストとしてLinkBut​​tonを追加します。各リンクボタンには、IDと一般的なClickイベントが割り当てられていました。 Clickイベントのコードが実行されていないか、またはイベントがトリガーされていない可能性があります。以下の私のコード:[編集]その他の記事(dynamically created list of link buttons, link buttons not posting back)で提案されているように、私はこのようにしようとした動的に作成されたリンクボタンの共通イベントは発生しません

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

以下は、私は動的にページの負荷にとSelectedIndexChangedに呼び出されたコントロールを作成し、機能を持っているDropDownList

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

のための私のSelectedIndexChangedEventです。

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

そして、これはLinkButton

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

私はそれを試してみるとあなたに戻ってきます... – Tres

+0

私はあなたの質問を見て、その解決策を準備しました。 @トレス –

+0

私の悪い、あなたのコードを使用することはできません。私の枠組みはまだ3.5です。申し訳ありません – Tres

0

ためClick eventである私は笑ブルートコードを使用して、それを解決しました。 コントロールのイベントはポストバック時にバインドされていないため、ポストバック時に再作成します。したがって私のPage_Loadでは、コントロールを再作成して対応するイベントにバインドするモジュールを呼び出しました。これは動作しますが...

これらのコントロールを再作成すると重複が作成され(Multiple Controls with same ID were found)、panel.FindControlのようにIDでコントロールを検出すると問題が発生します。 このシナリオを解決するには、同じ制御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); 
     } 
    } 
} 
関連する問題