2009-07-24 5 views
1

Ich bekomme den folgenden Fehler, nachdem ich das Debuggen meines Programms starten. Weißt du, wie das zu beheben ist?NullReferenceException Controls.Add C# Fehler

System.NullReferenceException was unhandled by user code 
Message="Object reference not set to an instance of an object." 

Es auf die Linie bezieht:

pnlDropDownList.Controls.Add(ddl); 

innerhalb des CreateDropDownLists Methode. Anscheinend muss das ddl ein Null-Objekt sein, obwohl ich ddl gerade zuvor in derselben Methode initialisiert habe. Verstehst du, warum ich diesen Fehler erhalte? Siehe Code unten ...

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Diagnostics; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using ADONET_namespace; 
using MatrixApp; 

namespace AddFileToSQL 
{ 
public partial class DataMatch : _Default 
{ 

protected System.Web.UI.WebControls.PlaceHolder phTextBoxes; 
protected System.Web.UI.WebControls.PlaceHolder phDropDownLists; 
protected System.Web.UI.WebControls.Button btnAnotherRequest; 
protected System.Web.UI.WebControls.Panel pnlCreateData; 
protected System.Web.UI.WebControls.Literal lTextData; 
protected System.Web.UI.WebControls.Panel pnlDisplayData; 
Panel pnlDropDownList; 
protected static string inputfile2; 
static string[] headers = null; 
static string[] data = null; 
static string[] data2 = null; 
static DataTable myInputFile = new DataTable("MyInputFile"); 
static string[] myUserSelections; 

// a Property that manages a counter stored in ViewState 
protected int NumberOfControls 
{ 
get { return (int)ViewState["NumControls"]; } 
set { ViewState["NumControls"] = value; } 
} 

public void EditRecord(object recordID) 
{ 
SelectedRecordID = recordID; 
// Load record from database and show in control 
} 

protected object SelectedRecordID 
{ 
get 
{ 
return ViewState["SelectedRecordID"]; 
} 

set 
{ 
ViewState["SelectedRecordID"] = value; 
} 
} 

protected void OnPreLoad(object sender, EventArgs e) 
{ 

//Create a Dynamic Panel 
pnlDropDownList = new Panel(); 
pnlDropDownList.ID = "pnlDropDownList"; 
pnlDropDownList.BorderWidth = 1; 
pnlDropDownList.Width = 300; 
this.form1.Controls.Add(pnlDropDownList); 
} 

// Page Load 
private void Page_Load(object sender, System.EventArgs e) 
{ 
if (!Page.IsPostBack) 
{ 
this.NumberOfControls = 0; 
} 
} 

// Add DropDownList Control to Placeholder 
private void CreateDropDownLists() 
{ 
for (int counter = 0; counter < NumberOfControls; counter++) 
{ 
DropDownList ddl = new DropDownList(); 
SqlDataReader dr = ADONET_methods.DisplayTableColumns(targettable); 
ddl.ID = "DropDownListID" + (counter + 1).ToString(); 
ddl.DataTextField = "COLUMN_NAME"; 
ddl.DataValueField = "COLUMN_NAME"; 
ddl.DataSource = dr; 
ddl.DataBind(); 
ddl.AutoPostBack = true; 
ddl.EnableViewState = true; //Preserves View State info on Postbacks 
ddl.Style["position"] = "absolute"; 
ddl.Style["top"] = 100 * counter + 80 + "px"; 
ddl.Style["left"] = 250 + "px"; 
ddl.SelectedIndexChanged += new EventHandler(this.OnSelectedIndexChanged); 
pnlDropDownList.Controls.Add(ddl); 
pnlDropDownList.Controls.Add(new LiteralControl("<br><br><br>")); 
dr.Close(); 
} 
} 

private void CreateLabels() 
{ 
for (int counter = 0; counter < NumberOfControls; counter++) 
{ 
Label lbl = new Label(); 
lbl.ID = "Label" + counter.ToString(); 
lbl.Text = headers[counter]; 
lbl.Style["position"] = "absolute"; 
lbl.Style["top"] = 100 * counter + 50 + "px"; 
lbl.Style["left"] = 250 + "px"; 
pnlDropDownList.Controls.Add(lbl); 
pnlDropDownList.Controls.Add(new LiteralControl("<br><br><br>")); 
} 
} 

// Add TextBoxes Control to Placeholder 
private void RecreateDropDownLists() 
{ 
for (int counter = 0; counter < NumberOfControls; counter++) 
{ 
DropDownList ddl = new DropDownList(); 
SqlDataReader dr = ADONET_methods.DisplayTableColumns(targettable); 
ddl.ID = "DropDownListID" + (counter + 1).ToString(); 
ddl.DataTextField = "COLUMN_NAME"; 
ddl.DataValueField = "COLUMN_NAME"; 
ddl.DataSource = dr; 
ddl.DataBind(); 
myUserSelections[counter] = ""; 
dr.Close(); 
ddl.AutoPostBack = true; 
ddl.EnableViewState = false; //Preserves View State info on Postbacks 
ddl.Style["position"] = "absolute"; 
ddl.Style["top"] = 100 * counter + 80 + "px"; 
ddl.Style["left"] = 250 + "px"; 
pnlDropDownList.Controls.Add(ddl); 
pnlDropDownList.Controls.Add(new LiteralControl("<br><br><br>")); 
} 
} 

// Create TextBoxes and DropDownList data here on postback. 
protected override void CreateChildControls() 
{ 
// create the child controls if the server control does not contains child controls 
this.EnsureChildControls(); 
// Creates a new ControlCollection. 
this.CreateControlCollection(); 
// Here we are recreating controls to persist the ViewState on every post back 

if (Page.IsPostBack) 
{ 
RecreateDropDownLists(); 
RecreateLabels(); 
} 

// Create these conrols when asp.net page is created 
else 
{ 
PopulateFileInputTable(); 
CreateDropDownLists(); 
CreateLabels(); 
} 

// Prevent child controls from being created again. 
this.ChildControlsCreated = true; 
} 

private void AppendRecords() 
{ 
switch (targettable) 
{ 
case "ContactType": 
for (int r = 0; r < myInputFile.Rows.Count; r++) 
{ ADONET_methods.AppendDataCT(myInputFile.Rows[r]); } 
break; 
case "Contact": 
for (int r = 0; r < myInputFile.Rows.Count; r++) 
{ ADONET_methods.AppendDataC(myInputFile.Rows[r]); } 
break; 
case "AddressType": 
for (int r = 0; r < myInputFile.Rows.Count; r++) 
{ ADONET_methods.AppendDataAT(myInputFile.Rows[r]); } 
break; 

default: throw new ArgumentOutOfRangeException("targettable type", targettable); 
} 
} 

// Read all the data from TextBoxes and DropDownLists 
protected void btnSubmit_Click(object sender, System.EventArgs e) 
{ 
int cnt = FindOccurence("DropDownListID"); 
EditRecord("DropDownListID" + Convert.ToString(cnt + 1)); 
AppendRecords(); 
pnlDisplayData.Visible = false; 
} 

private int FindOccurence(string substr) 
{ 
string reqstr = Request.Form.ToString(); 
return ((reqstr.Length - reqstr.Replace(substr, "").Length)/substr.Length); 
} 

#region Web Form Designer generated code 

override protected void OnInit(EventArgs e) 
{ 
InitializeComponent(); 
base.OnInit(e); 
} 

private void InitializeComponent() 
{ 
(this.btnSubmit_Click); 
} 

#endregion 

} 
} 

Antwort

3

denke ich, es zu "pnlDropDownList" sich bezieht ein Null-Objekt zu sein. Diese Funktion muss vor "pnlDropDownList = new Panel()" aufgerufen werden. in "OnPreLoad". Verwenden Sie Haltepunkte, um durch die Quelle zu gehen und dem Codepfad zu folgen. Ich bin sicher, Sie werden feststellen, dass dies der Fall ist.

+0

Check out Wenn das der Fall ist, kann es durch gelöst werden Initialisierung von pnlDropDownList im Konstruktor anstelle eines Ereignisses –

+0

@Martinho, danke, ich hätte eine Lösung anbieten und das Problem angeben sollen. –

+0

Danke Jungs, das hat es behoben! – salvationishere

1

Vielleicht möchten Sie die Erstellung Ihrer dynamische Steuerelemente in PreInit versuchen, ich habe das Gefühl, dass das Gremium noch nicht initialisiert wurde und daher die Ausnahme die Page Lifecycle

Verwandte Themen