проблемы с вложенным даталистом - PullRequest
2 голосов
/ 31 декабря 2011

У меня есть вложенная структура 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 ]

1 голос
/ 12 июня 2017

Вы делаете пару ошибок.Первый 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();
}
1 голос
/ 01 января 2012

Предполагая, что ваши данные создают более одной строки в DataList1, существует более одного DataList2. Поэтому ASP.NET не делает DataList2 членом класса вашей страницы (codebehind).

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

...