2011-12-31 113 views
2

我有内部DataList1嵌套的DataList结构DataList2其中我有2 Buttons内部DataList2执行某些命令,我​​想以调用作为输入的DataList1datakeyfieldDataList2datakeyfield的过程,但有是阅读的DataList2datakeyfield一个问题,这里是我的代码:问题嵌套数据列表

.aspx.cs代码

protected void DataList2_ItemCommand(object source, DataListCommandEventArgs e) 
{ 
    if ((e.CommandName == "accept") && (e.CommandArgument != null)) 
    { 
     string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString(); 
     SqlConnection conn = new SqlConnection(connStr); 
     int team_ID = (int)DataList1.DataKeys[e.Item.ItemIndex]; 
     SqlCommand cmd = new SqlCommand("accept_member", conn); 
     string member = (string)DataList2.DataKeys[e.Item.ItemIndex]; 
     cmd.CommandType = CommandType.StoredProcedure; 
     string email = Session["email"].ToString(); 
     int course_ID = Convert.ToInt32(Request.QueryString["courseID"]); 
     cmd.Parameters.Add(new SqlParameter("@course_ID", course_ID)); 
     cmd.Parameters.Add(new SqlParameter("@team_ID", team_ID)); 
     cmd.Parameters.Add(new SqlParameter("@myemail", email)); 
     cmd.Parameters.Add(new SqlParameter("@member", member)); 
     cmd.Parameters.Add(new SqlParameter("@respond", 1)); 
     SqlParameter count = cmd.Parameters.Add("@count", SqlDbType.Int); 
     count.Direction = ParameterDirection.Output; 

     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     if (@count.Value.ToString().Equals("1")) 
     { 
      Response.Write(@member + " " + "joined your team"); 

     } 
     else 
     { 
      Response.Write("team is full or not found"); 
     } 
    } 
    else if ((e.CommandName == "reject") && (e.CommandArgument != null)) 
    { 
     int team_ID = (int)DataList1.DataKeys[e.Item.ItemIndex]; 
     string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString(); 
     SqlConnection conn = new SqlConnection(connStr); 
     string member = (string)DataList2.DataKeys[e.Item.ItemIndex]; 
     SqlCommand cmd = new SqlCommand("accept_member", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     string email = Session["email"].ToString(); 
     int course_ID = Convert.ToInt32(Request.QueryString["courseID"]); 
     cmd.Parameters.Add(new SqlParameter("@course_ID", course_ID)); 
     cmd.Parameters.Add(new SqlParameter("@team_ID", team_ID)); 
     cmd.Parameters.Add(new SqlParameter("@myemail", email)); 
     cmd.Parameters.Add(new SqlParameter("@member", member)); 
     cmd.Parameters.Add(new SqlParameter("@respond", "0")); 
     SqlParameter count = cmd.Parameters.Add("@count", SqlDbType.Int); 
     count.Direction = ParameterDirection.Output; 

     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     if (@count.Value.ToString().Equals("1")) 
     { 
      Response.Write(@member + " " + "has been rejected"); 
     } 
     else 
     { 
      Response.Write("team is full or not found"); 
     } 
    } 

    DataList2.DataBind(); 
} 

错误:

The name "DataList2" does not exist in the current context

回答

0

假设你的数据在DataList1生产超过一排,有不止一个DataList2。因此,ASP.NET不会使DataList2成为页面(代码隐藏)类的成员。

幸运的是,在这种情况下,发件人(您称为源,同样的东西)应该是你想要的DataList2。尝试将其转换为DataList并查看会发生什么。

1

你犯了一些错误。第一个DataList2不能直接访问(正如你已经注意到的)。其次,您对父级和子级DataList使用相同的ItemIndex。但是由于它们是嵌套的,它们不具有相同的值,但需要由不同的数组索引访问。

protected void DataList2_ItemCommand(object source, DataListCommandEventArgs e) 
{ 
    //cast the source back to a the datalist 
    DataList datalist2 = source as DataList; 

    //get the value from the nested datalist 
    string childValue = (string)datalist2.DataKeys[e.Item.ItemIndex]; 

    //get the parent object of datalist2 
    DataListItem dli = datalist2.NamingContainer as DataListItem; 

    //get the value from the parent datalist using the itemindex of the parent, not the child 
    int parentValue = (int)DataList1.DataKeys[dli.ItemIndex]; 

    //show results 
    Label1.Text = parentValue + " - " + childValue; 

    //rebind datalist2 
    datalist2.DataBind(); 
}