-4
我在ASP.NET和C#中構建了一個簡單的CRUD(創建,讀取,更新,刪除)系統。我得到的錯誤Object reference not set to an instance of an object
在線79:有人可以幫我解決這個錯誤:對象引用未設置爲對象的實例
Line 77: SqlParameter forn = new SqlParameter("@fornavn", SqlDbType.VarChar, 100);
Line 78: forn.Direction = ParameterDirection.Input;
Line 79: forn.Value = Fornavn.Text;
Line 80: insertParameters.Add(forn);
我的代碼看起來像這樣kunder.aspx:
<%@ Page Language="C#" Debug="true" AutoEventWireup="true" CodeFile="kunder.aspx.cs" Inherits="Secure_kunder" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="KundeGrid" runat="server" AutoGenerateColumns="False" DataSourceID="kundeDataSource"
DataKeyNames="kundeid" ShowFooter="true" OnRowCommand="Customers_RowCommand">
<Columns>
<asp:TemplateField HeaderText="Kundenr">
<ItemTemplate>
<%# Eval("kundeid") %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Fornavn">
<ItemTemplate>
<%# Eval("fornavn") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="EditFornavn" runat="server" Text='<%# Bind("fornavn") %>' />
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" ID="InsertFirstName" Text='<%# Bind("fornavn") %>' />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Efternavn">
<ItemTemplate>
<%# Eval("efternavn") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="EditLastName" Text='<%# Bind("efternavn") %>' />
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" ID="InsertLastName" Text='<%# Bind("efternavn") %>' />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Firma">
<ItemTemplate>
<%# Eval("firma") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="EditFirma" Text='<%# Bind("firma") %>' />
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" ID="InsertFirma" Text='<%# Bind("firma") %>' />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Website">
<ItemTemplate>
<%# Eval("website") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="EditWebsite" Text='<%# Bind("website") %>' />
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" ID="InsertWebsite" Text='<%# Bind("website") %>' />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Pakke">
<ItemTemplate>
<%# Eval("pakke") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="EditPakke" Text='<%# Bind("pakke") %>' />
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" ID="InsertPakke" Text='<%# Bind("pakke") %>' />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Oprettelsesdato">
<ItemTemplate>
<%# Eval("oprettelsesdato") %>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="EditOprettelsesdato" Text='<%# Bind("oprettelsesdato") %>' />
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox runat="server" ID="InsertOprettelsesdato" Text='<%# Bind("oprettelsesdato") %>' />
</FooterTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Commands">
<ItemTemplate>
<asp:Button runat="server" ID="Edit" Text="Edit" CommandName="Edit" />
<asp:Button runat="server" ID="Delete" Text="Delete" CommandName="Delete" />
</ItemTemplate>
<EditItemTemplate>
<asp:Button runat="server" ID="Update" Text="Update" CommandName="Update" />
<asp:Button runat="server" ID="Cancel" Text="Cancel" CommandName="Cancel" />
</EditItemTemplate>
<FooterTemplate>
<asp:Button runat="server" ID="Insert" Text="Insert" CommandName="InsertNew" />
<asp:Button runat="server" ID="Cancel" Text="Cancel" CommandName="CancelNew" />
</FooterTemplate>
</asp:TemplateField>
</Columns>
<EmptyDataTemplate>
Fornavne:<asp:TextBox runat="server" ID="NoDataFornavn" />
Efternavn:<asp:TextBox runat="server" ID="NoDataEfternavn" />
Firma:<asp:TextBox runat="server" ID="NoDataFirma" />
Website:<asp:TextBox runat="server" ID="NoDataWebsite" />
Pakke:<asp:TextBox runat="server" ID="NoDataPakke" />
Oprettelsesdato:<asp:TextBox runat="server" ID="NoDataOprettelsesdato" />
<asp:Button runat="server" ID="NoDataInsert" CommandName="NoDataInsert" Text="Insert" />
</EmptyDataTemplate>
</asp:GridView>
<asp:SqlDataSource ID="kundeDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:minConnectionString %>"
SelectCommand="SELECT * FROM [kunder]"
InsertCommand="Insert into kunder (fornavn, efternavn, firma, website, pakke, oprettelsesdato) values (@fornavn, @efternavn, @firma, @website, @pakke, @oprettelsesdato)"
UpdateCommand="Update kunder set [email protected], [email protected], [email protected], [email protected], [email protected], [email protected] where [email protected]"
DeleteCommand="Delete from kunder where [email protected]"
oninserting="Sqldatasource1_Inserting"
OnInserted="Sqldatasource1_Inserted">
</asp:SqlDataSource>
</div>
</form>
</body>
</html>
kunder.aspx.cs:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data.Common;
public partial class Secure_kunder : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
// here we keep the SqlParameters that we will use to insert new row
private List<SqlParameter> insertParameters = new List<SqlParameter>();
protected void Customers_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "NoDataInsert")
{
TextBox Fornavn = KundeGrid.Controls[0].Controls[0].FindControl("NoDataFornavn") as TextBox;
TextBox Efternavn = KundeGrid.Controls[0].Controls[0].FindControl("NoDataEfternavn") as TextBox;
TextBox Firma = KundeGrid.Controls[0].Controls[0].FindControl("NoDataFirma") as TextBox;
TextBox Website = KundeGrid.Controls[0].Controls[0].FindControl("NoDataWebsite") as TextBox;
TextBox Pakke = KundeGrid.Controls[0].Controls[0].FindControl("NoDataPakke") as TextBox;
TextBox Oprettelsesdato = KundeGrid.Controls[0].Controls[0].FindControl("NoDataOprettelsesdato") as TextBox;
SqlParameter forn = new SqlParameter("@fornavn", SqlDbType.VarChar, 100);
forn.Direction = ParameterDirection.Input;
forn.Value = Fornavn.Text.ToString();
insertParameters.Add(forn);
SqlParameter efte = new SqlParameter("@efternavn", SqlDbType.VarChar, 100);
efte.Direction = ParameterDirection.Input;
efte.Value = Efternavn.Text;
insertParameters.Add(efte);
SqlParameter firm = new SqlParameter("@firma", SqlDbType.VarChar, 100);
firm.Direction = ParameterDirection.Input;
firm.Value = Firma.Text;
insertParameters.Add(firm);
SqlParameter webs = new SqlParameter("@website", SqlDbType.VarChar, 100);
webs.Direction = ParameterDirection.Input;
webs.Value = Website.Text;
insertParameters.Add(webs);
SqlParameter pakk = new SqlParameter("@pakke", SqlDbType.VarChar, 100);
pakk.Direction = ParameterDirection.Input;
pakk.Value = Pakke.Text;
insertParameters.Add(pakk);
SqlParameter opre = new SqlParameter("@oprettelsesdato", SqlDbType.VarChar, 100);
opre.Direction = ParameterDirection.Input;
opre.Value = Oprettelsesdato.Text;
insertParameters.Add(opre);
kundeDataSource.Insert();
}
else if (e.CommandName == "InsertNew")
{
TextBox Fornavn = KundeGrid.FooterRow.FindControl("InsertFornavn") as TextBox;
TextBox Efternavn = KundeGrid.FooterRow.FindControl("InsertEfternavn") as TextBox;
TextBox Firma = KundeGrid.FooterRow.FindControl("InsertFirma") as TextBox;
TextBox Website = KundeGrid.FooterRow.FindControl("InsertWebsite") as TextBox;
TextBox Pakke = KundeGrid.FooterRow.FindControl("InsertPakke") as TextBox;
TextBox Oprettelsesdato = KundeGrid.FooterRow.FindControl("InsertOprettelsesdato") as TextBox;
SqlParameter forn = new SqlParameter("@fornavn", SqlDbType.VarChar, 100);
forn.Direction = ParameterDirection.Input;
forn.Value = Fornavn.Text;
insertParameters.Add(forn);
SqlParameter efte = new SqlParameter("@efternavn", SqlDbType.VarChar, 100);
efte.Direction = ParameterDirection.Input;
efte.Value = Efternavn.Text;
insertParameters.Add(efte);
SqlParameter firm = new SqlParameter("@firma", SqlDbType.VarChar, 100);
firm.Direction = ParameterDirection.Input;
firm.Value = Firma.Text;
insertParameters.Add(firm);
SqlParameter webs = new SqlParameter("@website", SqlDbType.VarChar, 100);
webs.Direction = ParameterDirection.Input;
webs.Value = Website.Text;
insertParameters.Add(webs);
SqlParameter pakk = new SqlParameter("@pakke", SqlDbType.VarChar, 100);
pakk.Direction = ParameterDirection.Input;
pakk.Value = Pakke.Text;
insertParameters.Add(pakk);
SqlParameter opre = new SqlParameter("@oprettelsesdato", SqlDbType.VarChar, 100);
opre.Direction = ParameterDirection.Input;
opre.Value = Oprettelsesdato.Text;
insertParameters.Add(opre);
kundeDataSource.Insert();
}
}
protected void Sqldatasource1_Inserting(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters.Clear();
foreach (SqlParameter p in insertParameters)
e.Command.Parameters.Add(p);
}
protected void Sqldatasource1_Inserted(object sender, SqlDataSourceStatusEventArgs e)
{
insertParameters.Clear();
}
}
我相信他可能要查找的字段實際上是「InsertFirstName」,因爲其餘元素是通過「FooterTemplate」中的元素找到的。但答案是正確的,因爲他正在尋找一個不存在的領域。 –
@MikeMcCaughan:是的,你是對的,那很可能是正確的控制。通過控件查看我也發現了同名的姓氏。 :) – Guffa
啊啊這樣一個愚蠢的錯誤!非常感謝您的參與! –