Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click        Dim i As Integer
        Dim j As Integer        '打开数据库,往数据库中写如调研的基本信息
        Dim sqlconn As SqlConnection
        Dim sqlconnstr As String
        Dim sqlcom As SqlCommand
        Dim sqlreader As SqlDataReader        sqlconnstr = "server=localhost;uid=sa;pwd=;database=Online_Research"
        sqlconn = New SqlConnection(sqlconnstr)
        sqlconn.Open()
        sqlcom = New SqlCommand
        sqlcom.Connection = sqlconn
        sqlcom.CommandText = "Insert Into Research (Name,Content,TextBox_Count,CheckBox_Count,MultiBox_Count,TextArea_Count,Start_Time,End_Time) Values('" & ResearchName.Text & "','" & ResearchContent.Text & "'," & TextBox3.Text & "," & TextBox4.Text & "," & Textbox1.Text & "," & TextBox5.Text & "," & TextBox6.Text & "," & TextBox7.Text & ")"
        sqlcom.ExecuteNonQuery()
        sqlcom = Nothing        '读出刚才设置的在线调研的ID
        sqlcom = New SqlCommand
        sqlcom.Connection = sqlconn
        sqlcom.CommandText = "Select Top 1 Research_ID From Research Where Name='" & ResearchName.Text & "' Order By Design_Time Desc "
        sqlreader = sqlcom.ExecuteReader
        While sqlreader.Read
            j = sqlreader.GetInt32("0")
        End While
        sqlcom = Nothing
        sqlreader.Close()        '打开数据库,写入每一个调研题目,遍历页面中的用户控件
        Dim sqlComBulid As SqlCommandBuilder
        Dim ds As New DataSet
        Dim sqlda As SqlDataAdapter
        sqlda = New SqlDataAdapter("Select * From Question", sqlconn)
        sqlComBulid = New SqlCommandBuilder(sqlda)
        sqlda.Fill(ds, "Research_Questions")        Dim drow As DataRow
        Dim UserControl As Control        For i = 0 To TextBox3.Text + TextBox4.Text + TextBox5.Text + Textbox1.Text - 1
            drow = ds.Tables("Research_Questions").NewRow()
            UserControl = Page.FindControl("Question" & i + 1)            drow(1) = j
            Dim label1 As Label
            Dim label2 As Label
            Dim textbox1 As TextBox
            Dim textbox2 As TextBox
            label1 = UserControl.FindControl("QuestionID")
            label2 = UserControl.FindControl("QuestionType")
            textbox1 = UserControl.FindControl("QuestionName")
            textbox2 = UserControl.FindControl("QuestionContent")
            drow(2) = label1.Text
            drow(3) = label2.Text
            drow(4) = textbox1.Text
            drow(5) = textbox2.Text
            ds.Tables("Research_Questions").Rows.Add(drow)
            ds.Tables("Research_Questions").AcceptChanges()
        Next
        sqlda.Update(ds, "Research_Questions")        sqlconn.Close()
        sqlconn = Nothing    End Sub以上代码好像没有什么问题,但是运行的时候却说:“/Research”应用程序中的服务器错误。
--------------------------------------------------------------------------------未将对象引用设置到对象的实例。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
行 212:            Dim textbox1 As TextBox
行 213:            Dim textbox2 As TextBox
行 214:            label1 = UserControl.FindControl("QuestionID") /*调试时说这一行有错*/
行 215:            label2 = UserControl.FindControl("QuestionType")
行 216:            textbox1 = UserControl.FindControl("QuestionName")
 
这个问题已经困扰了我快一周了,高手们,热心人们,请帮一把!谢谢!

解决方案 »

  1.   

    对于你的usercontrol确定是用户控件不是自定义控件吗?
    如果是usercontrol,那么对于定义在usercontrol
    里的控件对于其他的form来说都是不可见得,也就是说UserControl.FindControl("QuestionType")找不到的。你可以用其他的方法实现,将你的userconrol里的控件text赋值给公用变量,然后用公用变量处理,至少你加一个module,在里面定义public变量是可以的
      

  2.   

    估计你的UserControl是你自己写的自定义控件吧?这样的话,当你把自定义控件加入页面的时候,其实生成了HTML后,它的ID就变了,比如,("QuestionID") 就已经不再是这样了,而是类似于
    webform1:QuestionID,因为同样的用户控件你可以放置好几个,所以,你再用
    UserControl.FindControl("QuestionID") 查找,肯定找不到
      

  3.   

    鉴于你的情况,我建议你在Usercontrol中设置property
    Public Property label1() As String
            Get
                Return label1.text
            End Get
            Set(ByVal Value As String)
                label1.text= Value
            End Set
        End Property
      

  4.   

    label1 = UserControl.FindControl("QuestionID")
    在UserControl内没有找到id为QuestionID的控件的时候 label1就是null
    下面用一个为null的控件的text属性 当然就出现NullReferenceException异常了
    一般应该在findcontrol后判断一下是否为null在使用它你的UserControl内没有找到id为QuestionID的控件 建议你仔细看一下你的页面结构看看 QuestionID是不是直接在userControl内的?
      

  5.   

    usercontrol是你的自定义控件吧 倒进来了吗
      

  6.   

    设断点查查
    UserControl = Page.FindControl("Question" & i + 1)
    应该是没有找到UserControl
      

  7.   

    跟踪一下 看看能否获得UserControl  
      

  8.   

    设断点查查
    UserControl = Page.FindControl("Question" & i + 1)
    应该是没有找到UserControl
    谢谢您的提醒!调试时确实没有找到,原来在加载的时是这样子的:
           
            '动态生成各类型题的具体设置
            For i = 0 To TextBoxCount + CheckBoxCount + TextAreaCount + MultiBoxCount - 1
                Dim myUserControl As Control
                Dim QuestionID As Label
                Dim QuestionName As TextBox
                Dim QuestionType As Label
                Dim QuestionContent As TextBox            '每一个题都加载Control_Template.ascx模板,生成每个模板的相应属性,多数为其Text属性
                'QuestionID存放问题的序号
                'QuestionName存放问题的名称
                'QuestionContent存放问题的内容
                'QuestionType存放问题的类型
                'DropDownList1存放是单选还是多选的下拉列表,如果是文本框或者文本域,则此项不显示
                myUserControl = Page.LoadControl("Control_Template.ascx")
                myUserControl.ID = "Question" & i + 1
                QuestionID = myUserControl.FindControl("QuestionID")
                QuestionName = myUserControl.FindControl("QuestionName")
                QuestionType = myUserControl.FindControl("QuestionType")
                QuestionContent = myUserControl.FindControl("QuestionContent")            QuestionID.Text = i + 1
                QuestionName.Text = "这里填写题干的内容!"请问:该怎样才能找到这些动态加载的控件呢?(因为现在想遍历加载的控件,取得其某些属性,比方说里面的TextBox,Label的Text)
      

  9.   

    谢谢各位GGJJ,不知能不能帮忙想个办法找出UserControl呢?
    在调试的时候发现:
    UserControl = Page.FindControl("Question" & i + 1)
    结果:
    Usercontrol=Nothing
    没有找到UserControl。非常谢谢!