2010-12-18 36 views
7

Tôi có một hộp kiểm và một bảng điều khiển bên trong điều khiển FormView và tôi cần truy cập chúng từ mã phía sau để sử dụng hộp kiểm để xác định xem bảng có hiển thị hay không. Đây là mã mà tôi đã sử dụng ban đầu, nhưng kể từ khi tôi đặt các điều khiển bên trong FormView, nó không còn hoạt động nữa.ASP.NET, VB: làm cách nào để truy cập các điều khiển bên trong FormView từ mã phía sau?

Protected Sub checkGenEd_CheckedChanged(ByVal sender As Object, _ 
             ByVal e As System.EventArgs) 
    If checkGenEd.Checked = True Then 
     panelOutcome.Visible = True 
    Else 
     panelOutcome.Visible = False 
    End If 
End Sub 

Tôi đã bắt đầu để tìm ra này dựa trên các câu hỏi khác tôi nhìn lên trên đây, nhưng tất cả đều là trong C# thay vì VB, vì vậy đây là như xa như tôi nhận:

Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound 
    If FormView1.CurrentMode = FormViewMode.Edit Then 

    End If 
End Sub 

Vì vậy, tôi không chắc chắn chính xác làm thế nào để hoàn thành nó. Tôi xin lỗi, điều này có thể là khá cơ bản, nhưng tôi mới ở đây và bất kỳ trợ giúp sẽ được đánh giá cao!

EDIT: đây là mã của tôi bây giờ là:

Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound 
    If FormView1.CurrentMode = FormViewMode.Edit Then 

     CheckBox checkGenEd = formview1.FindControl("checkGenEd"); 
     Panel panelOutcome = formview1.FindControl("panelOutcome"); 

    End If 
End Sub 

Nó cũng nói rằng checkGenEd và panelOutcome không khai báo.

EDIT: Tôi đã thay đổi mã của tôi để điều này, nhưng nó vẫn không hoạt động:

Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound 
    If FormView1.CurrentMode = FormViewMode.Edit Then 

     Dim checkGenEd As CheckBox = FormView1.FindControl("checkGenEd") 
     Dim panelOutcome As Panel = FormView1.FindControl("panelOutcome") 

     If checkGenEd.Checked = True Then 
      panelOutcome.Visible = True 
     Else 
      panelOutcome.Visible = False 
     End If 

    End If 
End Sub 

Không có bất kỳ lỗi nào nữa, nhưng không có gì xảy ra khi tôi nhấp vào hộp kiểm. Tôi nghĩ rằng cần phải có một số loại sự kiện để kích hoạt nó nhưng tôi không biết làm thế nào bạn có thể đặt một xử lý sự kiện bên trong của một xử lý sự kiện.

Trả lời

10

Với FormView, bạn phải sử dụng kiểm soát tìm kiếm, như trong:

CheckBox checkGenEd = (CheckBox)formview1.FindControl("checkGenEd"); 
Panel panelOutcome = (Panel)formview1.FindControl("panelOutcome"); 

Bạn không có thể tham khảo một điều khiển trực tiếp bằng ID.

HTH.

+0

Được rồi, nhưng bây giờ nó nói với tôi rằng 'CheckBox' là một loại và không thể được sử dụng như một biểu thức. – Sara

+0

Tôi nghĩ rằng đó thường là lỗi cú pháp, bạn có thể đăng những gì bạn có không? Bạn cũng có thể thử cú pháp thay thế ở trên ... –

+2

Dim checkGenEd As CheckBox = CType (FormView1.FindControl ("checkGenEd"), CheckBox) cho phép đúc tương đương vb. – Tom

2

Trong VB bạn cần sử dụng Directcast

Dim chk As Checkbox = DirectCast(Me.FormView1.FindControl("checkgen"), Checkbox) 
+0

Bạn đã đăng cùng một điều như câu hỏi http://stackoverflow.com/questions/7128764/handles-a-control-in-a-formview-in-asp-net –

2

FormView có khuôn khổ sự kiện riêng của mình. Một điều khiển bình thường trong FormView sẽ không tạo ra các sự kiện postback mà bạn đang tìm kiếm. Ban đầu tôi đã phạm sai lầm tương tự. Tôi muốn, giống như bạn, để tạo ra một số loại postback có thể bị chặn ở cuối máy chủ. Khi chúng tôi quay lại máy chủ, chúng tôi có thể xem xét các giá trị trong hộp kiểm, v.v. tùy thuộc vào bất kỳ quy tắc kinh doanh nào áp dụng. Đây là những gì tôi đã làm.

Trước hết đặt tất cả các điều khiển có liên quan trong một phần

<EditItemTemplate> 

trong FormView. (Có các thẻ Mẫu khác có thể phù hợp hơn). Để tạo postback có một nút (ví dụ) như nút dưới đây. (Điều này cũng phải nằm trong phần EditItemTemplate):

<asp:linkbutton id="UpdateButton" 
    text="Update" 
    commandname="Update" 
    runat="server"/> 

Bạn có thể chặn điều này tại máy chủ với sự kiện FormView ItemCommand. Ví dụ:

Private Sub FormView1_ItemCommand(sender As Object, e As System.Web.UI.WebControls.FormViewCommandEventArgs) Handles FormView1.ItemCommand 
    'your code here 
End Sub 

Khi bạn quay lại máy chủ, bạn có thể bắt đầu xem các điều khiển khác nhau để xem những gì họ giữ, sử dụng findControl nếu cần. Lệnh nút được hiển thị ở trên là ví dụ để bạn có thể muốn sử dụng một điều khiển khác.

Các vấn đề liên quan