2012-02-15 52 views
0

所以我有一个文本框的数组动态出现(文本框的数量取决于数据库中的数字)。他们画在屏幕上很好。将值放入一个文本框数组(ASP.NET使用C#)

i = 0; 

    while (i < size) 
    { 
     pnlTxtBoxes.Controls.Add(labels[i]); 
     pnlTxtBoxes.Controls.Add(txtBoxes[i]); 
     pnlTxtBoxes.Wrap = true; 
     i++; 
    } 

就像我说的那样,文本框出现,标签显示正确。但是当我去检索他们的文本时,我得到错误“对象引用未设置为对象的实例”。

i = 0; 

    while (i < size) 
    { 
     values[i] = txtBoxes[i].Text; 
     txtBoxes[i].Visible = false; 
     labels[i].Visible = false; 
     i++; 
    } 

有没有人有一个想法,为什么我得到这个错误(以及我能做些什么来解决它)?

编辑:这里是所有的代码。这只是一个开发数据库,​​所以我不担心出在没有看到更多的代码,密码

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using MySql.Data.MySqlClient; 

public partial class dieClearanceCalc : System.Web.UI.Page 
{ 
static string connectionString = "database=localhost;database=matedevdb;uid=dev;pwd=123;"; 
MySqlConnection con = new MySqlConnection(connectionString); 
MySqlCommand cmd = new MySqlCommand("SELECT shapeName FROM tblShapes;"); 
MySqlDataReader reader; 
int size; 
TextBox[] txtBoxes; 
Label[] labels; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    cmd.Connection = con; 
    try 
    { 
     con.Open(); 
     reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     { 
      shapeSelection.Items.Add(reader.GetString(0)); 
     } 
     reader.Close(); 
    } 
    catch (Exception ex) 
    { 
     Response.Write("<p style='Color:red'>Error:<br/>" + ex + "</p>"); 
    } 
} 
protected void shapeSelected(object sender, EventArgs e) 
{ 
    string[] labelTxt; 
    int i = 0; 

    //Make current elements invisable 
    lblShape.Visible = false; 
    shapeSelection.Visible = false; 
    btnSelectShape.Visible = false; 

    // find the size of the arrays 
    cmd.CommandText = "SELECT COUNT(varID) FROM tblVariables WHERE shapeID IN(SELECT shapeID FROM tblShapes WHERE shapeName= '" + shapeSelection.SelectedValue + "')"; 
    reader = cmd.ExecuteReader(); 
    if (reader.Read()) 
    { 
     size = reader.GetInt32(0); 
    } 
    reader.Close(); 

    labelTxt = new string[size]; 
    labels = new Label[size]; 
    txtBoxes = new TextBox[size]; 

    // gather the labels from the db 
    cmd.CommandText = "SELECT varDesc FROM tblVariables WHERE shapeID IN(SELECT shapeID FROM tblShapes WHERE shapeName= '" + shapeSelection.SelectedValue + "')"; 
    reader = cmd.ExecuteReader(); 

    i = 0; 

    while (reader.Read()) 
    { 
     labelTxt[i] = reader.GetString("varDesc"); 
     i++; 
    } 
    reader.Close(); 

    i = 0; 

    while (i < size) 
    { 
     labels[i] = new Label(); 
     txtBoxes[i] = new TextBox(); 
     labels[i].Text = labelTxt[i]; 
     i++; 
    } 

    i = 0; 

    while (i < size) 
    { 
     pnlTxtBoxes.Controls.Add(labels[i]); 
     pnlTxtBoxes.Controls.Add(txtBoxes[i]); 
     pnlTxtBoxes.Wrap = true; 
     i++; 
    } 

    btnSendData.Visible = true; 
    //Response.Write(size); test to see if the size variable is working 
    Response.Write(size); 

} 

protected void calc(object sender, EventArgs e) 
{ 
    //declarations 
    formula diagonal, periphery; 
    string dFormula = "", pFormula = ""; 
    string[] variables; 
    string[] values; 
    int i = 0; 
    //end of declarations 

    // This value must be retrievd again, because somewhere size is getting a value of 0 
    cmd.CommandText = "SELECT COUNT(varID) FROM tblVariables WHERE shapeID IN(SELECT shapeID FROM tblShapes WHERE shapeName= '" + shapeSelection.SelectedValue + "')"; 
    reader = cmd.ExecuteReader(); 
    if (reader.Read()) 
    { 
     size = reader.GetInt32(0); 
    } 
    reader.Close(); 


    variables = new string[size]; 
    values = new string[size]; 

    i = 0; 

    while (i < size) 
    { 
     values[i] = txtBoxes[i].Text; 
     txtBoxes[i].Visible = false; 
     labels[i].Visible = false; 
     i++; 
    } 

    btnSendData.Visible = false; 

    // retrieve the diagonal formula from the db 
    cmd.CommandText = "SELECT diagonalFormula, peripheryFormula FROM tblShapes WHERE shapeName='" + shapeSelection.SelectedValue + "'"; 
    reader = cmd.ExecuteReader(); 
    while (reader.Read()) 
    { 
     dFormula = reader.GetString("diagonalFormula"); 
     pFormula = reader.GetString("peripheryFormula"); 
    } 
    reader.Close(); 

    Response.Write(size); 

    // gather the variable names from the db 
    cmd.CommandText = "SELECT varName FROM tblVariables WHERE shapeID IN(SELECT shapeID FROM tblShapes WHERE shapeName= '" + shapeSelection.SelectedValue + "')"; 
    reader = cmd.ExecuteReader(); 

    while (reader.Read()) 
    { 
     variables[i] = reader.GetString("varName"); 
     i++; 
    } 
    reader.Close(); 

    con.Close(); 

    diagonal = new formula(dFormula, variables, values); 
    periphery = new formula(pFormula, variables, values); 

    txtDiagonal.Visible = true; 
    txtPeriphery.Visible = true; 

    txtDiagonal.Text = diagonal.getEquation(); 
    txtPeriphery.Text = periphery.getEquation(); 
} 

public static double Evaluate(string expression) 
{ 
    System.Data.DataTable table = new System.Data.DataTable(); 
    table.Columns.Add("expression", string.Empty.GetType(), expression); 
    System.Data.DataRow row = table.NewRow(); 
    table.Rows.Add(row); 
    return double.Parse((string)row["expression"]); 
} 

}

+0

哪行代码特别抱怨? – 2012-02-15 02:33:13

+0

你在哪里定义了“值”?这里有很多相关的代码缺失 – BrokenGlass 2012-02-15 02:37:32

+1

asp.net页面有它们的生命周期。加载时将重新创建页面的控件和变量。请给我们更多的细节,比如你的代码所在的方法。 – 2012-02-15 02:55:07

回答

0

使用ASP.NET编程时需要记住的一件重要事情是,您的整个对象模型都会一次又一次地用每个Web请求创建。这意味着如果您在页面加载不发生的事件中动态添加一些控件到页面,那么如果您不以某种方式再次添加它们,它们将无法在回发中生存。

你可以阅读有关Asp.Net页面生命周期的位置:http://msdn.microsoft.com/en-us/library/ms178472.aspx

我不认为这是解决你的问题的标准方式,但你正在做什么可以通过多种方式来实现。一个已经提到你 - 使用ViewState。另一个会在每个帖子后面打数据库,并确保每次提供页面时都重新创建控件。还有一种方法是以某种方式对重新生成控件所需的数据进行编码,并确保它们在每个帖子后面传递。后者本质上是ViewState的功能,但如果您想缩小ViewState的大小,并因此可以减少回发和页面的大小,则可以更高效地执行此操作。

0

,我只能猜测,问题在于,你填充txtBoxes[]阵列。确保该数组中没有空值。

+0

控件正确显示在页面上的事实表明相关值不是空值。 – 2012-02-15 03:17:35

+0

当呈现控件时,确定...发生这种情况时可能会发生什么情况(例如,*用户在其中输入数据后*)?这就是为什么我问这个数组是如何构建的。 – pete 2012-02-15 03:23:34

+0

@findcaiyzh有正确的答案。变量需要存储在viewstate中,然后在回发中检索。 (+1 to @findcaiyzh!)。 – pete 2012-02-15 03:27:36

1

我想你初始化标签和txtBoxes如果IsPostBack块,并不保存在ViewState或会话中。

编辑: 看到你的代码标签和txtBoxes在shapeSelected方法初始化。同样的问题会发生:它们在回发之间丢失。

所以在回发时它们在事件处理程序中是空的,因为整个页面对象在回发时被重新创建。 Asp.net运行有助于负荷的ViewState内容control.But类成员变量必须通过yourself.like维护:

public string NavigateUrl 
{ 
    get 
    { 
    string text = (string) ViewState["NavigateUrl"]; 
    if (text != null) 
     return text; 
    else 
     return string.Empty; 
    } 
    set 
    { 
    ViewState["NavigateUrl"] = value; 
    } 
} 

上面的代码来自:
了解ASP.NET视图状态
http://msdn.microsoft.com/en-us/library/ms972976.aspx
本文还介绍了视图状态和动态添加的控件

相关问题