问题:在点了DATAGRID中的AddRow按钮后此行row[0] = ((TextBox)e.Item.FindControl("Code")).Text;要出现未将对象引用设置到对象的实例的错误
SellFillFrist.aspx文件<asp:datagrid id="dgdGoods" runat="server" Width="713px" AutoGenerateColumns="False">
<Columns>
<asp:TemplateColumn HeaderText="产品编码">
<ItemTemplate>
<asp:TextBox id=txtCode runat="server" Width="84px" Text='<%#DataBinder.Eval(Container,"DataItem.Code")%>'>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id="Code" runat="server"  Width="84px" BorderStyle="Groove"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="产品名称">
<ItemTemplate>
<asp:TextBox id="txtGoodsName" runat="server"  Width="160px" BorderStyle="Groove" Text='<%#DataBinder.Eval(Container,"DataItem.GoodsName")%>'>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id="GoodsName" runat="server" Width="160px"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn> <asp:TemplateColumn HeaderText="单位">
<ItemTemplate>
<asp:TextBox id="txtDw" runat="server"  Width="40px" BorderStyle="Groove" Text='<%# DataBinder.Eval(Container, "DataItem.Dw")%>'>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id="Dw" runat="server" Width="41px"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="单价">
<ItemTemplate>
<asp:TextBox id="txtDj" runat="server"  Width="32px" BorderStyle="Groove" Text='<%# DataBinder.Eval(Container, "DataItem.Dj")%>'>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id="Dj" runat="server" Width="36px"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="数量">
<ItemTemplate>
<asp:TextBox id="txtNumber" runat="server"  Width="60px" BorderStyle="Groove" Text='<%# DataBinder.Eval(Container, "DataItem.Number")%>'>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id="Number" runat="server" Width="60px"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="折扣">
<ItemTemplate>
<asp:TextBox id="txtZk" runat="server" Width="45px" BorderStyle="Groove" Text='<%# DataBinder.Eval(Container, "DataItem.Zk")%>'>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id="Zk" runat="server" Width="48px"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="政策折扣">
<ItemTemplate>
<asp:TextBox id="txtZczk" runat="server" Width="41px" BorderStyle="Groove" Text='<%# DataBinder.Eval(Container, "DataItem.Zczk")%>'>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id="Zczk" runat="server" Width="42px"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="合计">
<ItemTemplate>
<asp:TextBox id="txtHj" runat="server"  Width="72px" BorderStyle="Groove" Text='<%# DataBinder.Eval(Container, "DataItem.Hj")%>'>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id="Hj" runat="server" Width="71px"></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<HeaderTemplate>
<asp:ImageButton id="ImageButton1" runat="server" CommandName="AddRow" ImageUrl="../Image/docnew.gif"></asp:ImageButton>
</HeaderTemplate>
<ItemTemplate>
<asp:ImageButton id="btDelete" runat="server" CommandName="Delete" ImageUrl="../Image/docdelete.gif"></asp:ImageButton>
</ItemTemplate>
<FooterTemplate>
<asp:ImageButton id="btAddRow" runat="server" CommandName="AddRow" ImageUrl="../Image/docnew.gif"></asp:ImageButton>
</FooterTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid>SellFillFrist.aspx.cs文件
namespace REB.web.Sell
{
/// <summary>
/// SellFillFrist 的摘要说明。
/// </summary>
public class SellFillFrist : System.Web.UI.Page
{

protected System.Web.UI.WebControls.DataGrid dgdGoods;
private DataSet dataSet = new DataSet();
private DataTable dt = new DataTable();
private int lastEditedPage;


private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack)
{
DataGridDataBind();
}
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.Load += new System.EventHandler(this.Page_Load); }
#endregion private void DataGridDataBind()
{            
dt.Columns.Add(new DataColumn("产品编码",typeof(String)));
dt.Columns.Add(new DataColumn("产品名称",typeof(String)));
dt.Columns.Add(new DataColumn("单位",typeof(String)));
dt.Columns.Add(new DataColumn("数量",typeof(System.Int32)));
dt.Columns.Add(new DataColumn("单价",typeof(Double)));
dt.Columns.Add(new DataColumn("折扣",typeof(Double)));
dt.Columns.Add(new DataColumn("政策折扣",typeof(Double)));
dt.Columns.Add(new DataColumn("合计",typeof(Double)));
try
{
//进行数据绑定
dgdGoods.DataSource = dt.DefaultView;
dgdGoods.DataBind();
}
catch(Exception error)
{
Response.Write(error.ToString());
}
} public void BindGrid()
{
//进行数据绑定
dgdGoods.DataSource = dt.DefaultView;
dgdGoods.DataBind();
} private void dgdGoods_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if("Delete" == e.CommandName)
{
                dt.Rows.Remove(dt.Rows[e.Item.DataSetIndex]);
if ((dgdGoods.PageCount - dgdGoods.CurrentPageIndex) == 1 && dgdGoods.Items.Count == 1)
{
if (dgdGoods.PageCount > 1)
{
lastEditedPage = lastEditedPage - 1;
}
else
{
lastEditedPage = 0;
}
}

                
BindGrid();
} if("AddRow" == e.CommandName)
{
DataRow row = dt.NewRow(); row[0] = ((TextBox)e.Item.FindControl("Code")).Text;
row[1] = ((TextBox)e.Item.FindControl("GoodsName")).Text;
row[2] = ((TextBox)e.Item.FindControl("Dw")).Text;
row[3] = ((TextBox)e.Item.FindControl("Dj")).Text;
row[4] = ((TextBox)e.Item.FindControl("Number")).Text;
row[5] = ((TextBox)e.Item.FindControl("Zk")).Text;
row[6] = ((TextBox)e.Item.FindControl("Zczk")).Text;
row[7] = ((TextBox)e.Item.FindControl("Hj")).Text;
dt.Rows.Add(row);
     dt.AcceptChanges();
BindGrid();
}
}
}
}

解决方案 »

  1.   

    private void DataGridDataBind()
    这个方法在你点击AddNewRow并不执行所以你的dt的row[0],row[1]之类是空的,对他们赋值必然引起,exception最好改一下
    private void DataGridDataBind()
    {            
    dt.Columns.Add(new DataColumn("产品编码",typeof(String)));
    dt.Columns.Add(new DataColumn("产品名称",typeof(String)));
    dt.Columns.Add(new DataColumn("单位",typeof(String)));
    dt.Columns.Add(new DataColumn("数量",typeof(System.Int32)));
    dt.Columns.Add(new DataColumn("单价",typeof(Double)));
    dt.Columns.Add(new DataColumn("折扣",typeof(Double)));
    dt.Columns.Add(new DataColumn("政策折扣",typeof(Double)));
    dt.Columns.Add(new DataColumn("合计",typeof(Double)));
    try
    {
    //进行数据绑定
    dgdGoods.DataSource = dt.DefaultView; 
                                         ViewState["data"] = ds;
    dgdGoods.DataBind();
    }
    catch(Exception error)
    {
    Response.Write(error.ToString());
    }
    }然后再addnewrow里
       ds = (DataSet)ViewState["data"];
       dt = ds.Tables[0];
       再处理
      

  2.   

    hdt(倦怠)你好,我调整过来了,但又出现无法找到表 0错误,
    错误行在dt = dataSet.Tables[0];
      

  3.   

    sorry没看清题
    DataGridDataBind()里最后加上
    ....
    dt.Columns.Add(new DataColumn("折扣",typeof(Double)));
    dt.Columns.Add(new DataColumn("政策折扣",typeof(Double)));
    dt.Columns.Add(new DataColumn("合计",typeof(Double)));
                          ds.Tables.Add(dt);
      

  4.   

    hdt(倦怠) 兄弟,还是不行,还是第一个错误
      

  5.   

    ViewState["data"] = dt // dt 改成 ds;
      

  6.   

    做个标记,回头看
    ViewState["data"] = dt   这存储一个对象结构,对性能大大不利但是很方便
      

  7.   

    呵呵确实如此,性能不好,但楼主没有用到数据库只用了DataTable,每办法只好这样
      

  8.   

    Thank you hdt(倦怠),根据你的思路我已经解决问题