2009-07-24 6 views
1

Je reçois l'erreur suivante après avoir commencé le débogage de mon programme. Savez-vous comment résoudre ce problème?NullReferenceException Controls.Add C# erreur

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

Il fait référence à la ligne:

pnlDropDownList.Controls.Add(ddl); 

dans la méthode CreateDropDownLists. Apparemment, le ddl doit être un objet nul, même si j'ai initialisé ddl juste avant dans cette même méthode. Comprenez-vous pourquoi je reçois cette erreur? Voir le code ci-dessous ...

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 

} 
} 

Répondre

3

Je pense qu'il fait référence à "pnlDropDownList" étant un objet nul. Cette fonction doit être appelée avant "pnlDropDownList = new Panel();" dans "OnPreLoad". Utilisez les points d'arrêt pour parcourir la source et suivre le chemin du code. Je suis sûr que vous trouverez que c'est le cas.

+0

Si tel est le cas, il peut être résolu par Initialiser pnlDropDownList dans le constructeur, au lieu d'un événement. –

+0

@Martinho, merci j'aurais dû offrir une solution ainsi que d'énoncer le problème. –

+0

Merci les gars, qui l'a réparé! – salvationishere

1

Vous pouvez essayer de créer vos contrôles dynamiques PreInit, j'ai le pressentiment que le Groupe spécial n'a pas encore été initialisé et donc l'exception Vérifiez la Page Lifecycle

Questions connexes