从gridview传递参数

时间:2012-12-10 09:56:39

标签: c# gridview

尝试从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");
                }
            }
        }
    }

5 个答案:

答案 0 :(得分:1)

您正在使用Response.Redirect打破循环您需要将do 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");
    }
}

答案 1 :(得分: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");

旁注:您无需检查DataControlRowType,因为GridView.Rows只会返回DataControlRowType.DataRow行(与RowDataBound - 事件不同)。

修改:我会使用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");
}

答案 2 :(得分: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");
}

答案 3 :(得分:0)

为什么每行都有lbl_taskID?在你的foreach循环中你做 -

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

您实际上只是在第一行中显示lbl_taskID的值。下一行将不再具有相同的元素。你的编码错了。您需要在每行中为您的标签命名,例如label0label1,...然后在您的代码中,您可以这样做 -

            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

答案 4 :(得分:0)

我使用了gridview向导中自动生成的EDIT按钮,它正在工作。

抱歉你浪费时间。