0

我在母版页中有下拉列表和按钮,当单击按钮时,我必须重定向到另一个继承母版页的页面 [results.aspx]。这是一个网格视图,用于根据下拉列表中的选定项目绑定数据。当我尝试这样做时,它会抛出

NullPointerException [对象引用未设置为对象的实例]

帮我解决这个问题。

这是我在 results.aspx.cs 的页面加载事件中所做的:

SqlConnection scon = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True");
protected void Page_Load(object sender, EventArgs e)
{
    if (Page.PreviousPage != null)
    {
        DropDownList d1 = (DropDownList)Master.FindControl("DropDownList1");
        DropDownList d2 = (DropDownList)Master.FindControl("DropDownList2");
        DropDownList d3 = (DropDownList)Master.FindControl("DropDownList3");
        SqlCommand scmd = new SqlCommand("select * from dreg where dcity='" + d2.SelectedItem.Text.ToString() + "' && dbg='" + d3.SelectedItem.Text.ToString() + "'", scon);
        scmd.Connection = scon;
        scon.Open();
        SqlDataAdapter sad = new SqlDataAdapter(scmd);
        SqlCommandBuilder scb = new SqlCommandBuilder(sad);
        DataTable dTable = new DataTable();
        sad.Fill(dTable);
        GridView1.DataSource = dTable;
        GridView1.DataBind();
    }
}

在某处我听说如果它在母版页上,你会找到前一页控件,因为.net 会自动更改其 ID。我能做些什么?

4

3 回答 3

2

您正在尝试访问母版页控件,因此您必须尝试以下操作:

DropDownList d1 = (DropDownList)Master.FindControl("DropDownList1");
DropDownList d2 = (DropDownList)Master.FindControl("DropDownList2");
DropDownList d3 = (DropDownList)Master.FindControl("DropDownList3");
SqlCommand scmd = new SqlCommand("select * from dreg where dcity='" + d2.SelectedItem.Text.ToString() + "' && dbg='" + d3.SelectedItem.Text.ToString() + "'", scon);

当您访问母版页控件时。所以不要使用page.PreviousPage.Instead 你应该去Master.FindControl访问Master Page Control

于 2013-04-03T09:48:08.660 回答
0

ClientIDMode ="Static",为控件设置此项,则 id 不应更改。

于 2013-04-03T09:37:14.453 回答
0

FindControl在任何级别都不是递归的。你不太可能DropDownList属于真正的主人。您将需要FindControl从面板或其他实际具有DropDownList. 这可能会变得模糊,因为您在 Master 中的子控件不是其基本类型的一部分,因此无法通过正常属性访问它们。我的建议是在您的母版页中添加一个直接引用以下内容的属性DropDownList

// Do this with a unique name for each
// DropDownList you want to access
// You may have to give the property a
// a different name to prevent conflicts
public DropDownList MyDropDownList
{
    get
    {
        return MyDropDownList;
    }
}

然后在使用此母版页的页面中,您需要在页面的 html 端添加此参考行:

<%@ MasterType 
    virtualpath="~/Path/To/Your.master" 
%>

这使编译器能够理解所引用的母版页的特定类型,因此在您后面的代码中,您可以直接访问该属性而无需强制转换:

DropDownList myList = Master.MyDropDownList;

注意:请,请,请研究并开始使用参数化查询。养成始终使用它们的习惯,即使在测试垃圾代码时也是如此。如果您不小心,使用内联 sql 之类的坏习惯会以一种令人讨厌的方式进入生产环境。

参数化查询如何帮助防止 SQL 注入?
http://www.dotnetperls.com/sqlparameter
http://blog.divergencehosting.com/?p=71

于 2013-04-08T17:04:09.087 回答