2012-09-25 2 views
0

ASP.NET 페이지 수명주기를 알고 있지만 혼란 스럽습니다. 데이터베이스 레코드에서 버튼을 만드는 코드가 있습니다. 클릭 한 후에는 코드가 실행되지 않아 사라집니다. .!동적으로 생성 된 단추 다시 만들기

 try 
     { 
      con.Open(); 
      SqlDataReader myReader = null; 
      SqlCommand myCom = new SqlCommand("select ID,client from tposClient where CardNo='" + cNo + "'", con); 

      myReader = myCom.ExecuteReader(); 

      Panel panel1 = new Panel(); 
      panel1.Style["text-align"] = "Center"; 
      panel1.Style["background"] = "blue"; 
      div_login.Visible = false; 

      while (myReader.Read()) 
      { 
       string b = myReader["client"].ToString(); 
       string id = myReader["ID"].ToString(); 

       Button btn = new Button(); 
       btn.Text = b; 
       btn.ID = id; 
       btn.Style["width"] = "100px"; 
       btn.Click += new EventHandler(btn_Click); 
       panel1.Controls.Add(btn); 

       panel1.Controls.Add(new LiteralControl("<br />")); 
       form1.Style.Add("display", "block"); 
       form1.Controls.Add(panel1); 
      } 
     } 
     catch (Exception k) 
     { 
      Console.WriteLine(k.ToString()); 
     } 
     finally 
     { 
      cmdselect.Dispose(); 
      if (con != null) 
      { 
       con.Close(); 
      } 
     } 
+0

GridView 나 Repeater 같은 웹 데이터 바인딩 된 컨트롤에서 'UserControls'를 사용할 수 있다는 것을 알고 계십니까? 다이나믹 컨트롤은 대부분의 경우 불필요합니다. –

+0

잘 모르겠습니다. 그리드에서 데이터를 읽고 "버튼"을 만들어야한다는 의미입니다. 당신의 해결책은 무엇입니까? – Arnes

+1

이 컨트롤을 재사용 가능한 ['UserControl'] (http://asp.net-tutorials.com/user-controls/using/)에 포함 시키려고합니다. 그런 다음 GridView의 'TemplateField'또는 [Repeater] 컨트롤 (http://msdn.microsoft.com/en-us/library/x8f2zez5.aspx)에 추가 할 수 있습니다. 위의 동적 코드를 얻으려면 이전과 같은 ID로 포스트 백 컨트롤을 다시 만들어야합니다. –

답변

1

당신은 단지 각각의 결과를 반복하는 ListView 컨트롤 내부의 Button을 넣어해야합니다 : :(난 후 Page_Init에서 그들을 다시 만들어야 알고 있지만 내가 도와주세요 방법을 모르는이 내 코드입니다 당신은 다시 얻을. 버튼이 방식으로 작동하기가 훨씬 쉬울 것입니다, 당신은 각 Postback의 컨트롤을 다시 처리 할 필요가 없습니다.

<asp:ListView ID="lv1" runat="server" OnItemDataBound="lv1_ItemDataBound"> 
    <ItemTemplate> 
     <asp:Button ID="btn1" runat="server" Text="my Text /> 
    </ItemTemplate> 
</asp:ListView> 
그 안에 버튼으로 목록보기 만들기

요 이후 데이터 액세스를 수행하려면 Dictionary<string, string>을 작성하여 각 버튼의 텍스트와 ID를 보유한 다음이를 사용하여 ListView을 바인드하십시오. 당신은 당신이 데이터베이스에서 얻을 ID에 특히 버튼의 ID를 설정해야 할 경우 당신은 당신의 단추 텍스트

public void lv1_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType != ListViewItemType.DataItem) 
    { 
     return; 
    } 

    KeyValuePair<string, string> idWithText = 
     (KeyValuePair<string, string>)e.Item.DataItem; 
    Button myButton = e.Item.FindControl("btn1") as Button; 
    myButton.Text = idWithText.Value; 
} 

을 설정할 수 있도록

//Your data access code 
Dictionary<string, string> buttonIdsWithText = new Dictionary<string, string>(); 
while(myReader.Read()) 
{ 
    string buttonText = myReader["client"].ToString(); 
    string buttonId = myReader["ID"].ToString(); 
    buttonIdsWithText.Add(buttonId, buttonText); 
} 
lv1.DataSource = buttonIdsWithText; 
lv1.DataBind(); 

ItemDataBound 이벤트 핸들러 만들기 (당신이 사용하고 있습니다. NET 4) 버튼의 ClientIDModeStatic으로 설정하고 id를 원하는 ID로 설정할 수 있습니다.

+0

마지막 부분에 문제가 있습니다 '... KeyValuePair idWithText = (KeyValuePair ) e.Item.DataItem; ... ' – Arnes

+0

무엇이 문제입니까? 무엇이 잘못되었는지를 모르는 경우에는 도움이되지 않습니다. 'DataItem'을 'KeyValuePair'로 캐스팅 할 수 있어야합니다. –

관련 문제