现在我的数据库中有两个表:
jq_class1表:
字段:
id
class1_namejq_class2表:
字段:
id
class1_name
class2_name我现在用DataGrid控件做jq_class2的修改操作,
现在发现一个问题,class1_name要到jq_class1表里面取,而我的代码是到jq_class2里面取数据,我不知道应该如何修改代码:请大家帮忙!
我的.aspx部分代码如下:
<asp:TemplateColumn HeaderText="一级栏目名称">
<ItemTemplate>
<asp:Label id="oneLabel" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "class1_name") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList id="onename" Runat="server" DataSource="<%#dv%>" DataTextField="class1_name" DataValueField="class1_name" SelectedValue='<%# DataBinder.Eval(Container.DataItem, "class1_name") %>'>
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>.cs部分代码如下:
private void DataGridClass2_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
SqlConnection MyConnection = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
string UpdateCmd = "UPDATE jq_class2 SET class1_name=@SName, class2_name=@TName WHERE id=@uid";
SqlCommand MyCommand = new SqlCommand(UpdateCmd, MyConnection);
......
SqlParameter parm2=new SqlParameter("@SName",SqlDbType.NVarChar,30);
parm2.Value=((DropDownList)e.Item.FindControl("onename")).SelectedValue;
MyCommand.Parameters.Add(parm2);
......
MyCommand.Connection.Open();
MyCommand.ExecuteNonQuery();
MyConnection.Close();
DataGridClass2.EditItemIndex = -1;
MyCommand.Connection.Close();
BindGridToSource();
}private void BindGridToSource()
{
SqlConnection MyConnection = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
string sqlstring = "SELECT * FROM jq_class2 order by id desc";
SqlDataAdapter MyCommand = new SqlDataAdapter(sqlstring, MyConnection);
ataSet ds = new DataSet();
MyCommand.Fill(ds, "jq_class2");
dv = ds.Tables["jq_class2"].DefaultView;
DataGridClass2.DataSource=dv;
DataGridClass2.DataBind();
}请帮忙看看应该怎么改,第一次写,不胜感激!

解决方案 »

  1.   

    我在cs中加入如下代码:
    private void DataGridClass2_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    SqlConnection Conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
    string sqlstring1 = "SELECT * FROM jq_class1 order by id desc";
    SqlDataAdapter Comm = new SqlDataAdapter(sqlstring1, Conn);
    DataSet dsone = new DataSet();
    Comm.Fill(dsone, "jq_class1");
    dvone = dsone.Tables["jq_class1"].DefaultView;
    DropDownList oneclasslist=(DropDownList)e.Item.FindControl("onename");
    oneclasslist.DataSource=dvone;
    oneclasslist.DataTextField="class1_name";
    oneclasslist.DataValueField="class1_name";
    oneclasslist.DataBind();
    oneclasslist.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,"class1_name"))).Selected=true;
    }
    报错:
    “/”应用程序中的服务器错误。
    --------------------------------------------------------------------------------未将对象引用设置到对象的实例。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
    行 154: dvone = dsone.Tables["jq_class1"].DefaultView;
    行 155:            DropDownList oneclasslist=(DropDownList)e.Item.FindControl("onename");
    行 156: oneclasslist.DataSource=dvone;
    行 157: oneclasslist.DataTextField="class1_name";
    行 158: oneclasslist.DataValueField="class1_name";
     源文件: e:\aspnet\manage\manageclass2.aspx.cs    行: 156 
    这是怎么回事啊?
      

  2.   

    这样写
    private void DataGridClass2_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
    {SqlConnection Conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
    string sqlstring1 = "SELECT * FROM jq_class1 order by id desc";
    SqlDataAdapter Comm = new SqlDataAdapter(sqlstring1, Conn);
    DataSet dsone = new DataSet();
    Comm.Fill(dsone, "jq_class1");
    dvone = dsone.Tables["jq_class1"].DefaultView;
    DropDownList oneclasslist=(DropDownList)e.Item.FindControl("onename");
    oneclasslist.DataSource=dvone;
    oneclasslist.DataTextField="class1_name";
    oneclasslist.DataValueField="class1_name";
    oneclasslist.DataBind();
    oneclasslist.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,"class1_name"))).Selected=true;}}
      

  3.   

    解释一下,就是把邦定放到if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
    {
    }中,DataGrid有好几种列,具体的ListItemType点就出来了,但是Header 和Footer是没有数据的,也就是DropDownList oneclasslist=(DropDownList)e.Item.FindControl("onename");返回的事null值。
      

  4.   

    感谢 happyfamily(FreeHorse) 我按照您说的方法添加了if判断
    可是还是报错,报错内容和原来一样
      

  5.   

    我把报错内容复制下来:
    “/”应用程序中的服务器错误。
    --------------------------------------------------------------------------------未将对象引用设置到对象的实例。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
    行 160: oneclasslist.DataValueField="class1_name";
    行 161: oneclasslist.DataBind();
    行 162: oneclasslist.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,"class1_name"))).Selected=true;
    行 163: }
    行 164: }
     
      

  6.   

    参考
    http://singlepine.cnblogs.com/articles/266538.html
    改成如下
    private void DataGridClass2_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
    if(e.Item.ItemType==ListItemType.EditItem)//改动这里
    {
    SqlConnection Conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
    string sqlstring1 = "SELECT * FROM jq_class1 order by id desc";
    SqlDataAdapter Comm = new SqlDataAdapter(sqlstring1, Conn);
    DataSet dsone = new DataSet();
    Comm.Fill(dsone, "jq_class1");
    dvone = dsone.Tables["jq_class1"].DefaultView;
    DropDownList oneclasslist=(DropDownList)e.Item.FindControl("onename");
    oneclasslist.DataSource=dvone;
    oneclasslist.DataTextField="class1_name";
    oneclasslist.DataValueField="class1_name";
    oneclasslist.DataBind();
    oneclasslist.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,"class1_name"))).Selected=true;
    }
    }
      

  7.   

    小山同志你好,我就是看你的例子做的感觉,长进不小,谢谢啦呵呵,我确实是将你说要改动的地方改了,可是报错:
    我把报错内容复制下来:
    “/”应用程序中的服务器错误。
    --------------------------------------------------------------------------------未将对象引用设置到对象的实例。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
    行 160:oneclasslist.DataValueField="class1_name";
    行 161:oneclasslist.DataBind();
    行 162:oneclasslist.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,"class1_name"))).Selected=true;
    行 163:}
    行 164:}
      

  8.   

    提示我这一句有问题:
    oneclasslist.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,"class1_name"))).Selected=true;
    数据库里面class1_name字段是Nvarchar类型,长度:30