How do I access a dynamically created PlaceHolder DropDownList control data items....

T

theo

Program flow...load file,then extract the xml text tags from the
file,then the number of
Xml tags retrieved from the file determines the number of dropdownlist
controls
instanciated in the placeholder,the user selects the required tags from
the
dropdownlists (if 5 Xml tags,then 5 dropdownlists each containing 5 xml
tags) and now
the btnSave button is selected which extracts the user selection form
the dropdownlists.

Once the btnLoadXmlTags_Click is selected,an array is filled with the
xml tags,this
function also creates a session variable call "OkToRecreateControls"
which permits Page
OnInit to recreate the controls for subsequent postbacks,then the
btnLoadXmlTags_Click function calls the CreateDynamicControls which in
turn calls
the function AddContentToDynamicControls.

All of the above works fine and for subsequent postbacks page onInit
calls
CreateDynamicControls which will now run since the
"OkToRecreateControls" session
variable is now valid.

Problem - when I try to extract the user selection form the
dropdownlists using the
using btnSave function the following error is generated...

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of
the current web
request.
Please review the stack trace for more information about the error and
where it originated
in the code.

Exception Details: System.NullReferenceException: Object reference not
set to an instance
of an object.

Source Error:


Line 276: DropDownList ddl = new DropDownList();
Line 277: ddl.ID = DropDownListName;
Line 278: strSeletedItems+= ddl.SelectedItem.Text + "\\n";

Source File: e:\complexx\aspxmldbmapper_v2\wfrmmain4.aspx.cs Line:
270

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an
object.]
AspXmlDbMapper_v2.wfrmMain4.ReadDropDownLists() in
e:\complexx\aspxmldbmapper_v2\wfrmmain4.aspx.cs:270
AspXmlDbMapper_v2.wfrmMain4.btnSave_Click(Object sender, EventArgs
e) in e:\complexx\aspxmldbmapper_v2\wfrmmain4.aspx.cs:253
System.Web.UI.WebControls.Button.OnClick(EventArgs e)

System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String
eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler
sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain()


So,how do I access the placeholders dropdownlists item content....Theo

Code sample...

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Data.SqlClient;
using System.Configuration;

namespace AspXmlDbMapper_v2
{

public class wfrmMain4 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.PlaceHolder plhDbContent;
protected System.Web.UI.WebControls.PlaceHolder plhXmlContent;
protected System.Web.UI.HtmlControls.HtmlInputFile fileDb;
protected System.Web.UI.HtmlControls.HtmlInputFile fileXml;

protected System.Web.UI.WebControls.Button btnLoadXml;
protected System.Web.UI.WebControls.Button btnLoadXmlTags;
protected System.Web.UI.WebControls.Button btnSave;
protected System.Web.UI.HtmlControls.HtmlGenericControl span2;
protected System.Web.UI.WebControls.DropDownList ddlXmlTagList;
protected System.Web.UI.LiteralControl literal;

private string xmlFileDestination = "";
private ArrayList aryTxtNodes = new ArrayList();
private ArrayList aryEleNodes = new ArrayList();
private ArrayList aryAtrbNodes = new ArrayList();

private void Page_Load(object sender, System.EventArgs e)
{

}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
CreateDynamicControls();
InitializeComponent();
base.OnInit(e);
}

private void InitializeComponent()
{
this.btnLoadXml.Click += new
System.EventHandler(this.btnLoadXml_Click);
this.btnLoadXmlTags.Click += new
System.EventHandler(this.btnLoadXmlTags_Click);
this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion

private void btnLoadXml_Click(object sender, System.EventArgs e)
{
string fileDestination = "C:\\TempXml";
string fileName = Path.GetFileName(fileXml.Value);
string fileExtentsion = Path.GetExtension(fileXml.Value);

xmlFileDestination = Path.Combine(fileDestination,fileName);
Session["xmlFilePath"] = xmlFileDestination;

if (fileXml.PostedFile != null )
{
//error check...file has .xml extentsion
if (fileExtentsion.ToString().Equals(".xml"))
{
try
{
fileXml.PostedFile.SaveAs(xmlFileDestination);
span2.InnerHtml = "File uploaded successfully to <b>" +
xmlFileDestination + "</b>";
Session["xmlFileLoadedOk"] = true;
fileXml.Dispose();
}
catch (Exception exc)
{
span2.InnerHtml = "Error saving file <b>" + xmlFileDestination +
"</b><br>"+ exc.ToString();
}
}
else
{
MsgBox("Error...loaded incorrect file type \\n\\nCorrect file type is
\" filename.xml \"");
}
}
}

private void btnLoadXmlTags_Click(object sender, System.EventArgs e)
{
int elementCount=0, attributeCount=0, textCount=0;

try
{
string fileDestination = (string)Session["xmlFilePath"];
StreamReader streamreader = new StreamReader (fileDestination);
XmlTextReader xmlReader = new XmlTextReader (streamreader);

while (xmlReader.Read())
{
string myNode = "";

switch (xmlReader.NodeType)
{
case XmlNodeType.Element:
elementCount++;
myNode = xmlReader.Name;
aryEleNodes.Add(myNode);

if (xmlReader.HasAttributes)
{
attributeCount++;
myNode = xmlReader.Value;
aryAtrbNodes.Add(myNode);
}

break;
case XmlNodeType.Text:
//assign last element name tag and current text value to string
myNode = "<" + aryEleNodes[aryEleNodes.Count-1].ToString() + ">" +
xmlReader.Value;
aryTxtNodes.Add(myNode);
textCount++;
break;
}
}
streamreader.Close();
xmlReader.Close();
string strObj = "true";
Session["OkToRecreateControls"] = strObj;
Session["tempArray"] = aryTxtNodes;
CreateDynamicControls();
}
catch(Exception exc)
{
span2.InnerHtml = "Error...loading xml tags </b><br>"+ exc.ToString();
}
}

public void CreateDynamicControls()
{
string strOkToRecreateControls =
(string)Session["OkToRecreateControls"];

if (strOkToRecreateControls != null)
{
ArrayList aryNodes = (ArrayList)Session["tempArray"];

for (int createControl=0; createControl < aryNodes.Count;
createControl++)
{
literal = new LiteralControl();
literal.ID = "ltrId" + (createControl + 1).ToString();
plhXmlContent.Controls.Add(literal);


ddlXmlTagList = new DropDownList();
ddlXmlTagList.ID = "ddlId" + (createControl + 1).ToString();
plhXmlContent.Controls.Add(ddlXmlTagList);
}

string strObj = "true";
Session["OkToAddContent"] = strObj;
Session["OkToRecreateControls"] = strOkToRecreateControls;
AddContentToDynamicControls();
}
}

public void AddContentToDynamicControls()
{
string strOkToAddContent = (string)Session["OkToAddContent"];

if (strOkToAddContent != null)
{
ArrayList aryNodes = (ArrayList)Session["tempArray"];

for (int addContent = 0; addContent < aryNodes.Count; addContent++)
{
string ltrName = "ltrId" + (addContent + 1).ToString();
string ddlName = "ddlId" + (addContent + 1).ToString();

LiteralControl ltl =
(LiteralControl)this.FindControl("plhXmlContent").FindControl(ltrName);
DropDownList ddl =
(DropDownList)this.FindControl("plhXmlContent").FindControl(ddlName);

ltl.Text = "<p><strong>Xml Tag " + (addContent + 1) + ":</b>";

for(int addItem = 0;addItem < aryNodes.Count;addItem++)
{
ddl.Items.Add(aryNodes[addItem].ToString());
}

ddl.SelectedIndex = addContent;
}
}
}

private void btnSave_Click(object sender, System.EventArgs e)
{
MsgBox(ReadDropDownLists());
}

public string ReadDropDownLists()
{
string strSeletedItems = "";

for (int i = 0; i<Page.Controls.Count; i++)
{
string DropDownListName = "ddlXmlTagList" + (i+1).ToString();
DropDownList ddl =
(DropDownList)Page.FindControl("plhXmlContent").FindControl(DropDownListName);
strSeletedItems+= ddl.SelectedItem.Text + "\\n";
}

return strSeletedItems;
}

public void MsgBox(string strMsg)
{
string alertScript;

alertScript = "<script language=JavaScript> alert('" + strMsg +"');
</script" +">";

if (!IsClientScriptBlockRegistered("alert"))
this.RegisterClientScriptBlock("alert", alertScript);
}
}
}
 
D

Dan Bass

There appears to be a contradiction in the error and the code provided...

The code in the error wouldn't work here:

DropDownList ddl = new DropDownList();
ddl.ID = DropDownListName;
strSeletedItems+= ddl.SelectedItem.Text + "\\n";

A new instance of a list is being created, then you're trying to get the
selected from it when SelectedItem would be null. The code is closer, with
trying to actually get a reference to the list on the page.

The code provide appears a little over complex:

public string ReadDropDownLists()
{
string strSeletedItems = "";
for (int i = 0; i < Page.Controls.Count; i++)
{
string DropDownListName = "ddlXmlTagList" + (i + 1).ToString();
DropDownList ddl =
(DropDownList)Page.FindControl("plhXmlContent").FindControl(DropDownListName);
strSeletedItems += ddl.SelectedItem.Text + "\\n";
}
return strSeletedItems;
}


why not just write:

DropDownList ddl = plhXmlContent.FindControl(DropDownListName);
if ( ddl != null )
{
if ( ddl.SelectedIndex >= 0 )
{
selectedItemsText += ddl.SelectedItem.Text;
}
}


you can then apply your error handling to cases where the list object is
null, or there is no user selection...


theo said:
Program flow...load file,then extract the xml text tags from the
file,then the number of
Xml tags retrieved from the file determines the number of dropdownlist
controls
instanciated in the placeholder,the user selects the required tags from
the
dropdownlists (if 5 Xml tags,then 5 dropdownlists each containing 5 xml
tags) and now
the btnSave button is selected which extracts the user selection form
the dropdownlists.

Once the btnLoadXmlTags_Click is selected,an array is filled with the
xml tags,this
function also creates a session variable call "OkToRecreateControls"
which permits Page
OnInit to recreate the controls for subsequent postbacks,then the
btnLoadXmlTags_Click function calls the CreateDynamicControls which in
turn calls
the function AddContentToDynamicControls.

All of the above works fine and for subsequent postbacks page onInit
calls
CreateDynamicControls which will now run since the
"OkToRecreateControls" session
variable is now valid.

Problem - when I try to extract the user selection form the
dropdownlists using the
using btnSave function the following error is generated...

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of
the current web
request.
Please review the stack trace for more information about the error and
where it originated
in the code.

Exception Details: System.NullReferenceException: Object reference not
set to an instance
of an object.

Source Error:


Line 276: DropDownList ddl = new DropDownList();
Line 277: ddl.ID = DropDownListName;
Line 278: strSeletedItems+= ddl.SelectedItem.Text + "\\n";

Source File: e:\complexx\aspxmldbmapper_v2\wfrmmain4.aspx.cs Line:
270

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an
object.]
AspXmlDbMapper_v2.wfrmMain4.ReadDropDownLists() in
e:\complexx\aspxmldbmapper_v2\wfrmmain4.aspx.cs:270
AspXmlDbMapper_v2.wfrmMain4.btnSave_Click(Object sender, EventArgs
e) in e:\complexx\aspxmldbmapper_v2\wfrmmain4.aspx.cs:253
System.Web.UI.WebControls.Button.OnClick(EventArgs e)

System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String
eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler
sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain()


So,how do I access the placeholders dropdownlists item content....Theo

Code sample...

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Data.SqlClient;
using System.Configuration;

namespace AspXmlDbMapper_v2
{

public class wfrmMain4 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.PlaceHolder plhDbContent;
protected System.Web.UI.WebControls.PlaceHolder plhXmlContent;
protected System.Web.UI.HtmlControls.HtmlInputFile fileDb;
protected System.Web.UI.HtmlControls.HtmlInputFile fileXml;

protected System.Web.UI.WebControls.Button btnLoadXml;
protected System.Web.UI.WebControls.Button btnLoadXmlTags;
protected System.Web.UI.WebControls.Button btnSave;
protected System.Web.UI.HtmlControls.HtmlGenericControl span2;
protected System.Web.UI.WebControls.DropDownList ddlXmlTagList;
protected System.Web.UI.LiteralControl literal;

private string xmlFileDestination = "";
private ArrayList aryTxtNodes = new ArrayList();
private ArrayList aryEleNodes = new ArrayList();
private ArrayList aryAtrbNodes = new ArrayList();

private void Page_Load(object sender, System.EventArgs e)
{

}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
CreateDynamicControls();
InitializeComponent();
base.OnInit(e);
}

private void InitializeComponent()
{
this.btnLoadXml.Click += new
System.EventHandler(this.btnLoadXml_Click);
this.btnLoadXmlTags.Click += new
System.EventHandler(this.btnLoadXmlTags_Click);
this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion

private void btnLoadXml_Click(object sender, System.EventArgs e)
{
string fileDestination = "C:\\TempXml";
string fileName = Path.GetFileName(fileXml.Value);
string fileExtentsion = Path.GetExtension(fileXml.Value);

xmlFileDestination = Path.Combine(fileDestination,fileName);
Session["xmlFilePath"] = xmlFileDestination;

if (fileXml.PostedFile != null )
{
//error check...file has .xml extentsion
if (fileExtentsion.ToString().Equals(".xml"))
{
try
{
fileXml.PostedFile.SaveAs(xmlFileDestination);
span2.InnerHtml = "File uploaded successfully to <b>" +
xmlFileDestination + "</b>";
Session["xmlFileLoadedOk"] = true;
fileXml.Dispose();
}
catch (Exception exc)
{
span2.InnerHtml = "Error saving file <b>" + xmlFileDestination +
"</b><br>"+ exc.ToString();
}
}
else
{
MsgBox("Error...loaded incorrect file type \\n\\nCorrect file type is
\" filename.xml \"");
}
}
}

private void btnLoadXmlTags_Click(object sender, System.EventArgs e)
{
int elementCount=0, attributeCount=0, textCount=0;

try
{
string fileDestination = (string)Session["xmlFilePath"];
StreamReader streamreader = new StreamReader (fileDestination);
XmlTextReader xmlReader = new XmlTextReader (streamreader);

while (xmlReader.Read())
{
string myNode = "";

switch (xmlReader.NodeType)
{
case XmlNodeType.Element:
elementCount++;
myNode = xmlReader.Name;
aryEleNodes.Add(myNode);

if (xmlReader.HasAttributes)
{
attributeCount++;
myNode = xmlReader.Value;
aryAtrbNodes.Add(myNode);
}

break;
case XmlNodeType.Text:
//assign last element name tag and current text value to string
myNode = "<" + aryEleNodes[aryEleNodes.Count-1].ToString() + ">" +
xmlReader.Value;
aryTxtNodes.Add(myNode);
textCount++;
break;
}
}
streamreader.Close();
xmlReader.Close();
string strObj = "true";
Session["OkToRecreateControls"] = strObj;
Session["tempArray"] = aryTxtNodes;
CreateDynamicControls();
}
catch(Exception exc)
{
span2.InnerHtml = "Error...loading xml tags </b><br>"+ exc.ToString();
}
}

public void CreateDynamicControls()
{
string strOkToRecreateControls =
(string)Session["OkToRecreateControls"];

if (strOkToRecreateControls != null)
{
ArrayList aryNodes = (ArrayList)Session["tempArray"];

for (int createControl=0; createControl < aryNodes.Count;
createControl++)
{
literal = new LiteralControl();
literal.ID = "ltrId" + (createControl + 1).ToString();
plhXmlContent.Controls.Add(literal);


ddlXmlTagList = new DropDownList();
ddlXmlTagList.ID = "ddlId" + (createControl + 1).ToString();
plhXmlContent.Controls.Add(ddlXmlTagList);
}

string strObj = "true";
Session["OkToAddContent"] = strObj;
Session["OkToRecreateControls"] = strOkToRecreateControls;
AddContentToDynamicControls();
}
}

public void AddContentToDynamicControls()
{
string strOkToAddContent = (string)Session["OkToAddContent"];

if (strOkToAddContent != null)
{
ArrayList aryNodes = (ArrayList)Session["tempArray"];

for (int addContent = 0; addContent < aryNodes.Count; addContent++)
{
string ltrName = "ltrId" + (addContent + 1).ToString();
string ddlName = "ddlId" + (addContent + 1).ToString();

LiteralControl ltl =
(LiteralControl)this.FindControl("plhXmlContent").FindControl(ltrName);
DropDownList ddl =
(DropDownList)this.FindControl("plhXmlContent").FindControl(ddlName);

ltl.Text = "<p><strong>Xml Tag " + (addContent + 1) + ":</b>";

for(int addItem = 0;addItem < aryNodes.Count;addItem++)
{
ddl.Items.Add(aryNodes[addItem].ToString());
}

ddl.SelectedIndex = addContent;
}
}
}

private void btnSave_Click(object sender, System.EventArgs e)
{
MsgBox(ReadDropDownLists());
}

public string ReadDropDownLists()
{
string strSeletedItems = "";

for (int i = 0; i<Page.Controls.Count; i++)
{
string DropDownListName = "ddlXmlTagList" + (i+1).ToString();
DropDownList ddl =
(DropDownList)Page.FindControl("plhXmlContent").FindControl(DropDownListName);
strSeletedItems+= ddl.SelectedItem.Text + "\\n";
}

return strSeletedItems;
}

public void MsgBox(string strMsg)
{
string alertScript;

alertScript = "<script language=JavaScript> alert('" + strMsg +"');
</script" +">";

if (!IsClientScriptBlockRegistered("alert"))
this.RegisterClientScriptBlock("alert", alertScript);
}
}
}
 
T

theo

Hi Dan Bass,

I tried out your code sample and the compiler required some minor
adjustments,with this your error checking works...the program doesn't
throw the previously mentioned runtime error....thank you

However when debugging this line of code if( ddl != null )
....it shows that dll (dropdownlist control) has a selected index of -1
even though selections have been made with each dropdownlist that are
instanciated on a placeholder control.

Problem - I think when ReadDropDownLists function is called it's reading
a incorrect control structure,else why is the dll (dropdownlist control)
not showing the user selections...

Code Sample

public string ReadDropDownLists()
{
string strSeletedItems = "";

for (int i = 0; i<Page.Controls.Count; i++)
{
string DropDownListName = "ddlXmlTagList" + (i+1).ToString();
DropDownList ddl =
(DropDownList)plhXmlContent.FindControl(DropDownListName);

if ( ddl != null )
{
if ( ddl.SelectedIndex >= 0 )
{
strSeletedItems += ddl.SelectedItem.Text + "\\n";;
}
}

}

return strSeletedItems;
}
 
D

Dan Bass

a couple of things I suppose you could check:
- is the enabled view state turned on (this is on by default) so that the
selection is remember in the post back?
- are you setting the selection at some point in the control initialisation,
so that when it loads up the controls, it sets the selection to -1?
- place break points on the Page_Load / Init events, as well as in the
button on click event and your "ReadDropDownList()" function, to check that
the sequence of methods executes in the order you'd expect.
- check the state of the lists when they are stored in the session object,
then again when they are read during a post back.

good luck
 
T

theo

The solution is to serach through the placeholder contorls (literal and
dropdownlist)in the same order in which the controls have been added
i.e. every second control added was a dropdownlist therefore this loop
skips through every second placeholder control only picking up the
controls needed and this discovery was helped by debugging the
placeholder control contents...Theo

Amended Code

public string ReadDropDownLists()
{
string strSeletedItems = "";
int intIndex = 1;

for (int i = 1;i <
this.FindControl("plhXmlContent").Controls.Count;i+=2)
{
DropDownList ddl =
(DropDownList)this.FindControl("plhXmlContent").Controls;//FindContro
l(DropDownListName);
if ( ddl != null )
{
if ( ddl.SelectedIndex >= 0 )
{
strSeletedItems += ddl.SelectedItem.Text + "\\n";;
}
}
intIndex++;
}
return strSeletedItems;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top