我有一个gridview,可以从存储过程中加载数据。
目的:
通过隐藏gridview中的select列来使完整的gridview行可单击 - 我可以通过在RowDataBound事件中执行以下代码来完成此操作。
接下来是当我在gridview中单击一个完整的行时,我应该能够从所选行中获取数据/值,并在弹出的模式框中的文本框中显示它。这是用于更新/编辑功能。
这是我的所得
protected void grdTenant_RowDataBound(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[0].Style["display"] = "none";
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes["onmouseover"] =
"javascript:setMouseOverColor(this);";
e.Row.Attributes["onmouseout"] =
"javascript:setMouseOutColor(this);";
e.Row.Attributes["onclick"] =
Page.ClientScript.GetPostBackClientHyperlink
(this.grdTenant, "Select$" + e.Row.RowIndex);
e.Row.Attributes.Add("onclick", String.Format("javascript:$find('{0}').show();",ModalEditTenant.ClientID ));
//this line does not work in retrieving row data
IDataRecord dataRow = (IDataRecord)e.Row.DataItem;
txtRPCode.Text = Convert.ToString(dataRow["Retail Partner"]);
}
}
作为替代方案,我这样做是为了实现第二个目标但未能完成第一个目标
protected void grdTenant_SelectedIndexChanged(object sender, EventArgs e)
{
GridViewRow row = grdTenant.SelectedRow;
txtRPCode.Text = row.Cells[1].Text;
ModalEditTenant.Show();
}
但是,此方法仅在选择按钮列可见且单击时才有效,当选择完整行时,它无法执行此操作。
如何成功选择完整行并将数据检索到文本框(隐藏选择列)
这就是gridview如何绑定存储过程数据源中的数据。
System.Threading.Thread.Sleep(500);
//DropDownList ddl = (DropDownList)sender;
SqlCommand cmd = new SqlCommand("spTenantList", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Location", ddlSelectLoc.SelectedValue );
try
{
con.Open();
grdTenant.EmptyDataText = "No Records Found";
grdTenant.DataSource = cmd.ExecuteReader();
grdTenant.DataBind();
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
con.Dispose();
}
答案 0 :(得分:1)
使用FindControl()
方法。
而不是txtRetailPartner
放置您的TextBox ID
。
txtRPCode.Text = ((TextBox)e.Row.FindControl("txtRetailPartner")).Text;
答案 1 :(得分:1)
在RowDataBound
事件中使用我的逻辑来获取DataItem
:
protected void grdTenant_RowDataBound(object sender, GridViewRowEventArgs e)
{
e.Row.Cells[0].Style["display"] = "none";
if (e.Row.RowType == DataControlRowType.DataRow)
{
IDataRecord dataRow = (IDataRecord)e.Row.DataItem;
txtRPCode.Text = Convert.ToString(dataRow["Retail Partner Code"]);
}
}
答案 2 :(得分:0)
我根据要实现的目标找到答案。使用当前发布的代码作为问题,只需删除那里的一行代码即可使用
protected void grdTenant_RowDataBound(object sender,GridViewRowEventArgs e) { e.Row.Cells [0] .Style [" display"] =" none";
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Attributes["onmouseover"] =
"javascript:setMouseOverColor(this);";
e.Row.Attributes["onmouseout"] =
"javascript:setMouseOutColor(this);";
e.Row.Attributes["onclick"] =
Page.ClientScript.GetPostBackClientHyperlink
(this.grdTenant, "Select$" + e.Row.RowIndex);
}
}
此行已删除:
//不再需要这个,因为它会使onselectedindexchanged事件失效,因为这将首先运行。
e.Row.Attributes.Add(" onclick",String.Format(" javascript:$ find(' {0}')。show ();",ModalEditTenant.ClientID));
protected void grdTenant_SelectedIndexChanged(object sender, EventArgs e)
{
GridViewRow row = grdTenant.SelectedRow;
txtRPCode.Text = row.Cells[1].Text;
ModalEditTenant.Show();
}
一切都会按预期工作。