2011-12-31 2 views
2

У меня есть вложенная структура DataList DataList2 внутри DataList1 где у меня есть 2 Buttons внутри DataList2, которые выполняют определенные команды, и я хочу вызвать процедуру, которая принимает в качестве входных datakeyfield из DataList1 и datakeyfield из DataList2, однако проблема с чтением datakeyfield из DataList2, вот мой код:проблем с вложенной DataList

.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 членом класса вашей страницы (codebehind).

К счастью, в этом случае отправитель (который вы назвали источником, то же самое) должен быть DataList2, который вы хотите. Попробуйте перечислить его в DataList и посмотреть, что произойдет.

1

Вы делаете пару ошибок. Первый DataList2 недоступен напрямую (как вы заметили). И во-вторых, вы используете тот же ItemIndex как для родительского, так и для дочернего DataList. Но так как они вложены, они не имеют одинаковых значений, но должны быть обра- зованы другим индексом массива.

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(); 
} 
Смежные вопросы