Проблемы с вложенным даталистом
У меня есть вложенная структура DataList DataList2
внутри DataList1
где у меня 2 Buttons
внутри DataList2
которые выполняют определенные команды, и я хочу вызвать процедуру, которая принимает в качестве входных данных datakeyfield
из DataList1
а также datakeyfield
из DataList2
Однако существует проблема с чтением datakeyfield
из DataList2
вот мой код:
.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();
}
Ошибка:
Имя "DataList2" не существует в текущем контексте
2 ответа
Вы делаете пару ошибок. Первый DataList2
не доступен напрямую (как вы заметили). И во-вторых, вы используете тот же 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();
}
Предполагая, что ваши данные создают более одной строки в DataList1, существует более одного DataList2. Поэтому ASP.NET не делает DataList2 членом класса вашей страницы (codebehind).
К счастью, в этом случае отправителем (который вы назвали source, тоже самое) должен быть DataList2, который вы хотите. Попробуйте привести его к DataList и посмотрите, что получится.