1

gridviewのラベルからパラメーターを渡そうとすると、最初の行のラベルテキストのみが渡されます。

何が欠けているのかわからない。

 protected void GV1_OnRowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "edit")
        {


            foreach (GridViewRow row in GridView1.Rows)
            {
                if (row.RowType == DataControlRowType.DataRow)
                {
                    Label lbl_taskID = (Label)row.FindControl("lbl_taskID");

                    Session["TaskID"] = lbl_taskID.Text;

                    Response.Redirect("~/tasks_edit.aspx");
                }
            }
        }
    }
4

5 に答える 5

1

ループを壊しています。すべての値を設定Response.Redirectするには、do outサイドループを配置する必要があります。また、上書きするのではなく、すべての行Response.Redirectの値を連結する必要があります。lbl_taskID

protected void GV1_OnRowCommand(object sender, GridViewCommandEventArgs e)
{
    string taskIds = string.Empty;
    if (e.CommandName == "edit")
    {


        foreach (GridViewRow row in GridView1.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                Label lbl_taskID = (Label)row.FindControl("lbl_taskID");

                if(Session["TaskID"] != null)
                  taskIds = Session["TaskID"].ToString();
                Session["TaskID"] = taskIds + lbl_taskID.Text + ",";                 
            }
        }
        Response.Redirect("~/tasks_edit.aspx");
    }
}
于 2012-12-10T09:58:27.913 に答える
0

ループを使用しforeachていますが、ループを使用して単一の値を単一のSession変数に割り当てています。それで、あなたは何を期待しますか?

ただし、最初の行ではなく最後の行が割り当てられていると思います。

Response.Redirect("~/tasks_edit.aspx")現在のリクエストを中止するため、ループの外に出す必要があります。現在編集モードになっている行を割り当てることができます。

foreach (GridViewRow row in gridView1.Rows)
{
    if (row.RowState == DataControlRowState.Edit)
    {
        Label lbl_taskID = (Label)row.FindControl("lbl_taskID");
        Session["TaskID"] = lbl_taskID.Text;
        break;
    }
}
Response.Redirect("~/tasks_edit.aspx");

補足:とにかく(-eventとは異なり)行を返すだけなDataControlRowTypeので、チェックする必要はありません。GridView.RowsDataControlRowType.DataRowRowDataBound

編集:代わりに:RowCommandのクリックイベントを使用しLinkButtonます

protected void EditLink_Clicked(Object sender, EventArgs e)
{
    // get the LinkButton reference
    LinkButton link = (LinkButton)  sender;
    // get the GridViewRow reference via NamingContainer
    GridViewRow row = (GridViewRow) link.NamingContainer;
    Label lbl_taskID = (Label) row.FindControl("lbl_taskID");
    Session["TaskID"] = lbl_taskID.Text;
    Response.Redirect("~/tasks_edit.aspx");
}
于 2012-12-10T10:01:12.973 に答える
0

最初の行のみが使用されている場合、なぜforeachループを使用するのですか?あなたは簡単にできますfind the control of the 0th row.

if (e.CommandName == "edit") //this makes sure that you have a row
{
  Label lbl_taskID = (Label)GridView1.Rows[0].FindControl("lbl_taskID");
  Session["TaskID"] = lbl_taskID.Text;  
  Response.Redirect("~/tasks_edit.aspx");
}

現在編集中の列からのラベルテキストを意味する場合は、take the index of the editing columnからCommandArgument、ラベルを取得します

if (e.CommandName == "edit") //this makes sure that you have a row
{
      int index = Convert.ToInt32(e.CommandArgument); //currently editing row index
      Label lbl_taskID = (Label)GridView1.Rows[index].FindControl("lbl_taskID");
      Session["TaskID"] = lbl_taskID.Text;  
      Response.Redirect("~/tasks_edit.aspx");
}
于 2012-12-10T10:02:21.743 に答える
0

どうしてあなたはlbl_taskIDすべての列にいるのですか?foreachループであなたの行動-

Label lbl_taskID = (Label)row.FindControl("lbl_taskID");

実際にlbl_taskIDは、最初の行の現在の値のみを取得しています。次の行には、同じ要素が再び含まれることはありません。コーディングが間違っています。各行のラベルに次のような名前を付ける必要があります-、、label0...label1コードで実行できます-

            int i=0;
            foreach(GridViewRow row in GridView1.Rows)
            {
                 Label xyz = (Label)row.FindControl("Label"+i);
                 Session["TaskID"+i] =xyz.Text; //to have unique session variables
                 i++;
            }
            Response.Redirect("~/tasks_edit.aspx"); // you should redirect only when you come out of the loop
于 2012-12-10T10:07:19.233 に答える
0

gridviewウィザードから自動生成されたEDITボタンを使用しましたが、機能しています。

時間の無駄でごめんなさい。

于 2012-12-18T10:46:26.713 に答える