2013-02-15 73 views
1

我试图从由中继器所生成的控件(复选框,下拉列表,文本框)的用户选择传递到一个数据表并使用它作为一个数据源以用于测试一个gridview并最终作为表变量参数存储到存储过程中。检索从动态创建texboxes文本

当存在一些没有复选框选择,不产生相应的文本框和代码抛出异常(check to determine if the object is empty before calling the method)。

,这似乎是导致该问题的部分是当我通过从texboxes到数据表中的文本。当我通过复选框名称它工作正常;我试图通过检查是否生成文本框控件来克服这一点,但它仍然会抛出相同的异常。

是否有更好的方法来检查是否产生动态文本框?

protected void Button2_Click(object sender, EventArgs e) 
{ 
    DataTable Frs = new DataTable("udtMParameters"); 
    Frs.Columns.Add("MName", typeof(string)); 
    Frs.Columns.Add("IsNum", typeof(string)); 
    Frs.Columns.Add("MValue1", typeof(string)); 
    Frs.Columns.Add("MValue2", typeof(string)); 
    try 
    { 

     foreach (RepeaterItem i in Repeater1.Items) 
     { 
      CheckBox fn = i.FindControl("chk") as CheckBox; 
      CheckBox isn = i.FindControl("ChkboxIsNumeric") as CheckBox; 
      PlaceHolder plc = i.FindControl("PlcMFilter") as PlaceHolder; 
      TextBox s = i.FindControl("start") as TextBox; 
      TextBox l = i.FindControl("end") as TextBox; 
      DropDownList d = i.FindControl("value") as DropDownList; 


      if (fn.Checked) 
      { 
       TextBox1.Text = fn.Text; 
       if (isn.Checked) 
       { 
        DataRow dr = Frs.NewRow(); 
        dr["MName"] = fn.Text; 
        dr["IsNum"] = "Y"; 
        if (String.IsNullOrEmpty(s.Text)) 
        { 
         dr["MValue1"] = s.Text; 
        } 
        else 
        { 
         dr["MValue1"] = " "; 
        } 
        if (String.IsNullOrEmpty(s.Text)) 
        { 
         dr["MValue2"] = l.Text; 
        } 
        else 
        { 
         dr["MValue2"] = " "; 
        } 

        Frs.Rows.Add(dr); 
       } 

       else 
       { 
        DataRow dr = Frs.NewRow(); 
        dr["MName"] = fn.Text; 
        dr["IsNum"] = "N"; 
        dr["MValue1"] = "MValue1"; 
        dr["MValue2"] = "MValue2"; 
        Frs.Rows.Add(dr); 

       } 
      } 

      this.GridView1.Visible = true; 
      GridView1.DataSource = Frs; 
      GridView1.DataBind(); 


      panel2.Enabled = true; 
      panel2.Visible = true; 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

} 
+0

欢迎堆栈溢出!请包括您得到的异常的详细信息,以及代码中的哪一行会引发异常。这将有助于人们帮助你。您可以使用问题下方的[编辑]链接添加该信息。谢谢,祝你好运! – jadarnel27 2013-02-15 17:04:16

+0

我做更多的研究我的问题,发现问题是动态创建控件没有在邮局后面保留,我需要在页面加载重建他们,但我仍然不知道如何保持用户选择在这些文本框和将它们传递给数据表。 – user1721546 2013-02-19 17:14:29

+0

一旦你重新创建它们,这些控件就会保持自己。 – 2013-02-19 17:17:20

回答

0

代替你铸造与实现为由括号,以本地化空对象

TextBox s = (TextBox)i.FindControl("start"); 
TextBox l = (TextBox)i.FindControl("end"); 

在一个转换失败的情况下,用括号铸造将抛出一个异常,而有作为的意志铸造产生一个空值。