尝试从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");
}
}
}
}
答案 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
的值。下一行将不再具有相同的元素。你的编码错了。您需要在每行中为您的标签命名,例如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
答案 4 :(得分:0)
我使用了gridview向导中自动生成的EDIT按钮,它正在工作。
抱歉你浪费时间。