2013-04-24 3 views
0

시각적 기본 웹 응용 프로그램에는 클릭 할 때 파일 다운로드를 허용하는 생성 된 버튼 목록이 있습니다.동적으로 생성 된 버튼은 포스트 백에서 함수를 호출하지 않습니다.

pageload에서 생성 된 버튼으로 작업하는 예가 있었지만 갑자기 다운로드 기능이 포스트 백에서 호출되는 것을 멈추었습니다. 이제 모든 버튼 클릭으로 페이지 포스트가 다시 생깁니다. .

내 코드 :

Public folder As String 
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     folder = "Main" 
     PopulateFiles(folder) 
    End If 
End Sub 

Protected Sub PopulateFiles(ByVal folder As String) 
    Dim myConnection As SqlConnection 
    Dim conString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString 
    Dim myCommand As SqlCommand 
    Dim myDataReader As SqlDataReader 
    Dim text As String 
    Dim size As Decimal 
    Dim name As String 
    Dim type As String 
    Dim id As Integer 
    folderName.Text = folder 
    container.Controls.Clear() 
    myConnection = New SqlConnection(conString) 
    myConnection.Open() 
    myCommand = New SqlCommand("Uploads_GetAllFiles", myConnection) 
    myCommand.CommandType = CommandType.StoredProcedure 
    myCommand.Parameters.AddWithValue("@folder", folder) 
    Try 
     myDataReader = myCommand.ExecuteReader() 
     If myDataReader.HasRows Then 
      Do While myDataReader.Read() 
       name = myDataReader.Item("Name") 
       type = myDataReader.Item("Type") 
       id = myDataReader.Item("File_ID") 
       size = Math.Round(myDataReader.Item("Size")/1000, 2) 
       container.Controls.Add(New LiteralControl("<div class='newRow'>")) 
       text = "<div class='fileName'>" & name & "</div>" 
       container.Controls.Add(New LiteralControl(text)) 
       text = "<div class='fileType'>" & type & "</div>" 
       container.Controls.Add(New LiteralControl(text)) 
       text = "<div class='fileSize'>" & size.ToString() & "kb</div>" 
       container.Controls.Add(New LiteralControl(text)) 
       container.Controls.Add(New LiteralControl("<div class='fileDownload'>")) 
       Dim newBtn As New Button 
       newBtn.ID = "link" & id 
       newBtn.Text = "Download" 
       newBtn.CssClass = "newbie" 
       AddHandler newBtn.Click, AddressOf Retreive_Doc 
       newBtn.CommandArgument = id 
       container.Controls.Add(newBtn) 
       container.Controls.Add(New LiteralControl("</div>")) 
       container.Controls.Add(New LiteralControl("<div class='fileDelete'>")) 
       Dim newDelBtn As New Button 
       newDelBtn.ID = "delete" & id 
       newDelBtn.Text = "Delete" 
       newDelBtn.CssClass = "delBtn" 
       AddHandler newDelBtn.Click, AddressOf Retreive_Xls 
       newDelBtn.CommandArgument = id 
       container.Controls.Add(newDelBtn) 
       container.Controls.Add(New LiteralControl("</div>")) 
       container.Controls.Add(New LiteralControl("</div>")) 
      Loop 
     End If 

    Catch ex As Exception 
     MsgBox(ex.ToString()) 
    Finally 
     myConnection.Close() 
    End Try 
End Sub 

Protected Sub Retreive_Doc(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click 
    Dim button As Button = sender 
    Dim id As Integer = button.CommandArgument 
    Dim cmd As SqlCommand = New SqlCommand("Uploads_GetFile") 
    cmd.CommandType = CommandType.StoredProcedure 
    cmd.Parameters.AddWithValue("@id", id) 
    Dim dt As DataTable = GetData(cmd) 
    If dt IsNot Nothing Then 
     download(dt) 
    End If 
End Sub 

내가이 함수에서 호출 기능을 보여줄 수 있지만, 초기 기능도 내가 포인트가 확실하지 않다라고되지 않습니다.

<form id="form1" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
<asp:FileUpload ID="upload1" runat="server" /><asp:Button ID="test1" runat="server" Text="Upload" /> 
<asp:TextBox ID="folderTag" runat="server" ></asp:TextBox> 
<asp:Button ID="search" runat="server" Text="Search" /> 
<asp:Label ID="folderName" runat="server">General</asp:Label><br /> 
<div id="navContainer" runat="server"> 

</div> 
    <div id="hiddenContent">  
    <asp:LinkButton ID="LinkButton1" CssClass="hide" runat="server" OnClick = "Retreive_Doc">Download Doc</asp:LinkButton> 
    <asp:LinkButton ID="LinkButton2" CssClass="hide" runat="server" OnClick = "Retreive_Xls">Download xls</asp:LinkButton> 
    </div> 
<div id="container" runat="server"> 
</div> 
</form> 

내가 전에 말했듯이 다음과 같이

내 HTML입니다. 이것은 며칠 전부터 일하고 있었고 다른 기능을 추가하는 과정을 통해 어떻게 든 잃어 버렸습니다.

나는 어떤 기능도 호출하지 않고 왜 다시 게시하는지 확신 할 수 없습니다.

도움 주셔서 감사합니다.

+0

ASP.NET '버튼'은 항상 포스트 백을 발생시킵니다. 포스트 백에서 동적으로 생성 된 컨트롤을 다시 만들어야합니다. 그러나 만약 당신이'If Not Is PostBack Then PopulateFiles()'를 가지고 있습니다. –

+0

예,하지만 처리기를 추가하는 함수가 포스트 백에서 호출되지 않습니다. 컨트롤은 원래 업데이트 패널에 있었고 다시 작성해야하는 컨트롤은 다른 함수 호출에있었습니다. 지금은 포스트 백에서 적절한 함수가 호출되는 한 컨트롤을 잃어 버리는 것이 좋습니다. – Blunderfest

+1

더 이상 통제가 없으면 이벤트도 발생하지 않습니다. –

답변

1

동적으로 생성 한 포스트 백에서 동일한 ID를 가진 컨트롤을 다시 만들어야합니다. 그렇지 않으면 포스트 백 후에 사라집니다.

페이지로드 이벤트에서 If Not IsPostBack Then을 제거하십시오.

당신이 CommandArgument을 원하는 경우 대신 Click 이벤트의 CommandEvent를 사용하지 않는 이유가 있나요 :

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
    Handles Me.Load 
    folder = "Main" 
    PopulateFiles(folder) 
End Sub 

또 다른 생각?

다시 <div id="container" runat="server"> 대신 PlaceHolder을 사용하지 않는 이유가 있습니까?

AddHandler newBtn.Command, AddressOf Retreive_Doc 
newBtn.CommandArgument = id 

.... 

protected void Retreive_Doc(object sender, CommandEventArgs e) 
+0

감사합니다. 이것이 문제였습니다. 그걸 어떻게 끝내야할지 모르겠다. 그리고 귀하의 질문에 대답하기 위해, 아니 이유가 없지만, 그 중 하나에 이점이 있습니까? – Blunderfest

+0

@Malcoda 당신이 그것을 알아 낸 것을 기쁘게 생각합니다. 정말 이점이 없습니다. 그러나 이러한 컨트롤과 이벤트는 이러한 용도로 사용되며 주로 읽기 쉽습니다. – Win

관련 문제