2012-02-14 38 views
1

私のページにコントロールを失わせるDataList内にDataListがあります。ページは機能し、エラーはありませんが、私のラベルは見つからない!ラベルがaspxページに表示されるので、これは奇妙です。削除したい2つのアイテムは削除されません。デバッグするとき、それは完全にIfステートメントをスキップ:それはデータベースから情報を引っ張っているとNULL値が存在しないため、ラベルがNullであると考える理由を私は理解していないFindControlがラベルコントロールを見つけることができません

​​

Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound 
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
     'Find the controls that are inside the DataList 
     Dim anstype As HiddenField = e.Item.FindControl("HiddenField1") 
     Dim questionid As HiddenField = e.Item.FindControl("HiddenField2") 
     Dim rbl As RadioButtonList = e.Item.FindControl("RadioButtonList1") 
     Dim cbl As CheckBoxList = e.Item.FindControl("CheckBoxList1") 
     Dim txt As TextBox = e.Item.FindControl("TextBox1") 
     Dim ds As DataSet = GetDataSet(questionid.Value) 
     Select Case anstype.Value 
      'if anstype is 's' then show a radio button list 
      Case "S" 
       rbl.Visible = True 
       cbl.Visible = False 
       txt.Visible = False 
       rbl.DataSource = ds 
       rbl.DataTextField = "Choice" 
       rbl.DataValueField = "ChoiceID" 
       rbl.DataBind() 
       'if anstype is 'm' then show a checkbox list 
      Case "M" 
       rbl.Visible = False 
       cbl.Visible = True 
       txt.Visible = False 
       cbl.DataSource = ds 
       cbl.DataTextField = "Choice" 
       cbl.DataValueField = "ChoiceID" 
       cbl.DataBind() 
       'if anstype is 't' then show a textbox 
      Case "T" 
       rbl.Visible = False 
       cbl.Visible = False 
       txt.Visible = True 
     End Select 
     Dim dl2 As DataList = CType(e.Item.FindControl("DataList2"), DataList) 
     Dim hidden2 As HiddenField = DirectCast(e.Item.FindControl("HiddenField2"), HiddenField) 
     Dim QID As Integer = Int32.Parse(hidden2.Value) 
     If QID = 33 Then 
      For Each li As DataListItem In dl2.Items 
       Dim lbl As Label = DirectCast(e.Item.FindControl("Label3"), Label) 
       If lbl IsNot Nothing Then 
        If lbl.Text = "Self Directed" Or lbl.Text = "Systems" Then 
         lbl.Visible = False 
        End If 
       End If 
      Next 
     End If 
    End If 
End Sub 


<asp:DataList ID="DataList1" runat="server" DataSourceID="SqlDataSource1" Width="100%" CellPadding="4" ForeColor="#333333"> 
<ItemTemplate> 

<asp:HiddenField ID="HiddenField2" runat="server" Value='<%# Eval("QuestionID") %>'> 
</asp:HiddenField> 
<asp:Label ID="lblQuesNum" runat="server" Font-Bold="True" Text='<%# Eval("QuestionNum") %>'> 
</asp:Label> 
<strong>)</strong> 
<asp:Label ID="Label2" runat="server" Font-Bold="True" Text='<%# Eval("Question") %>'> 
</asp:Label> 
<asp:HiddenField ID="hiddenPicklistID" runat="server" Value='<%# Eval("PicklistID") %>'> 
</asp:HiddenField> 
<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Eval("AnswerType") %>'> 
</asp:HiddenField> 

<asp:DataList ID="DataList2" runat="server" DataSourceID="dsPicklist"> 
<ItemTemplate> 
    <asp:HiddenField ID="hidPickID" runat="server" value='<%# Eval("PICKLISTID") %>'> 
    </asp:HiddenField> 
    <asp:Label ID="Label3" runat="server" Text='<%# Eval("TEXT") %>'></asp:Label> 
</ItemTemplate> 
</asp:DataList> 

</asp:DataList> 

UPDATE: 私は多少のコード​​を変更しましたが、今私は、ライン47

Line 45:    Dim dl2 As DataList = CType(e.Item.FindControl("DataList2"), DataList) 
Line 46:    Dim hidden2 As HiddenField = DirectCast(e.Item.FindControl("HiddenField2"), HiddenField) 
Line 47:    Dim QID As Integer = Int32.Parse(hidden2.Value) 
Line 48:    If QID = 33 Then 
Line 49:     For Each li As DataListItem In dl2.Items 



Protected Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound 
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
     'Find the controls that are inside the DataList 
     Dim anstype As HiddenField = e.Item.FindControl("HiddenField1") 
     Dim questionid As HiddenField = e.Item.FindControl("HiddenField2") 
     Dim rbl As RadioButtonList = e.Item.FindControl("RadioButtonList1") 
     Dim cbl As CheckBoxList = e.Item.FindControl("CheckBoxList1") 
     Dim txt As TextBox = e.Item.FindControl("TextBox1") 
     Dim ds As DataSet = GetDataSet(questionid.Value) 
     Dim dl2 As DataList = e.Item.FindControl("DataList2") 
     dl2.DataBind() 
     Select Case anstype.Value 
..... the rest of this code is the same as above until Case "T".... 


Protected Sub DataList2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) 
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim dl2 As DataList = CType(e.Item.FindControl("DataList2"), DataList) 
     Dim hidden2 As HiddenField = DirectCast(e.Item.FindControl("HiddenField2"), HiddenField) 
     Dim QID As Integer = Int32.Parse(hidden2.Value) 
     If QID = 33 Then 
      For Each li As DataListItem In dl2.Items 
       Dim lbl As Label = DirectCast(e.Item.FindControl("Label3"), Label) 
       If lbl IsNot Nothing Then 
        If lbl.Text = "Self Directed" Or lbl.Text = "Systems" Then 
         lbl.Visible = False 
        End If 
       End If 
      Next 
     End If 
    End If 
End Sub 

<asp:DataList ID="DataList2" runat="server" DataSourceID="dsPicklist" OnItemDataBound="DataList2_ItemDataBound"> 
<ItemTemplate> 
    <asp:HiddenField ID="hidPickID" runat="server" value='<%# Eval("PICKLISTID") %>'></asp:HiddenField> 
    <asp:Label ID="Label3" runat="server" Text='<%# Eval("TEXT") %>'></asp:Label> 
</ItemTemplate> 
</asp:DataList> 

UPDATEでエラーObject reference not set to an instance of an object.を得る:ワーキングコードポスト!

Protected Sub DataList2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) 
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim DataList2 = DirectCast(sender, DataList) 
     Dim ParentItem = DirectCast(DataList2.NamingContainer, DataListItem) 
     Dim HiddenField2 = DirectCast(ParentItem.FindControl("HiddenField2"), HiddenField) 
     Dim QID As Integer = Int32.Parse(HiddenField2.Value) 
     If QID = 33 Then 
      For Each li As DataListItem In DataList2.Items 
       Dim lbl As Label = DirectCast(e.Item.FindControl("Label3"), Label) 
       If lbl IsNot Nothing Then 
        If lbl.Text = "Self Directed" Or lbl.Text = "Systems" Then 
         lbl.Visible = False 
        End If 
       End If 
      Next 
     End If 
    End If 
End Sub 

これは「システム」のテキストのみを非表示にするため、私はその特定の質問の各ラベルを通過し、それぞれがそれ自体を隠しています。このコードは別のページでも動作しますので、Self Directedは正確に大文字に変換されています。私はデータベースからコピーして貼り付けてもそれは隠されません。非常に頑固。

+0

どのラインでエラーが表示されますか? –

+0

元の投稿にエラーメッセージを追加しました... – jlg

答えて

5

をe.Item.FindControlのli.FindControl( "LABEL3")instread( "LABEL3")を試してみてください:

Dim lbl As Label = DirectCast(li.FindControl("Label3"), Label) 

ラベルがあることインナーDataList項目であるので、あなたはループしています。それはあなたの次のエラー;-)

編集であるかどうところで

、同じことがhidPickIDをのHiddenFieldあなたに適用されます。

私はDataList2.ItemDataBoundイベントも処理することをお勧めします。コードのエラーが起こりにくく、より明確になり、DataList1.ItemDataBoundのすべての項目をループする必要はありません。

に電話する前にDataList1.ItemDataBoundに電話する必要があります。

EDIT2

あなたは、あなたが(DateList2.ItemDataBoundに)あなたのHiddenFieldを見つけることができ、親品目を取得するためにDataListItemDataList2.NamingContainerをキャストすることができます

Dim DataList2 = DirectCast(sender, DataList) 
Dim ParentItem = DirectCast(DataList2.NamingContainer), DataListItem) 
Dim HiddenField2 = DirectCast(ParentItem.FindControl("HiddenField2"),HiddenField) 

しかし、私は使用することをお勧めします代わりにDataSource(DateList2.ItemDataBound):

Dim rowView As DataRowView = CType(e.Item.DataItem, DataRowView) 
Dim QID = DirectCast(rowView("QID"), Int32) 

(それがDataRowに格納されている場合)

+0

これを変更して、今度はIfステートメントを実行します。しかし、まだ2つのラベル項目を隠すことはありません。私は前にDataList2のItemDataBoundを処理しようとしましたが、決してそれをヒットしません。だから私はDataList1でそのコードを投げたのです.....それはそのように実行されます。 – jlg

+1

@jlg:DataList1.ItemDataBoundでDataList2.DataBindを呼び出すことができませんでした(私の編集を参照)。あなたのコードが今でも動作するとしても、私はまだDataList2.ItemDataBoundを使用してお互いを分離することをお勧めします。 DataList1-Itemへの参照はここで取得できます。 –

+0

行の前に 'Dim dl2 As DataList = DataList1.FindControl(" DataList2 ") dl2.DataBind()'行の前に 'e.Item.ItemType = ListItemType.Itemまたはe.Item.ItemType = ListItemType.AlternatingItem Then' 'オブジェクト参照がオブジェクトのインスタンスに設定されていません。 'というエラーが表示されます。If e.Item行のすぐ下に同じ2行を置き、DataList2_ItemDataBoundはまだ実行されません。私のページに何も見つからない理由を知っていますか? – jlg

関連する問題