- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 2 个 Gridview。第一个网格有一个按钮,当单击该按钮时,它将使用基于所单击按钮的 ID 的数据填充第二个网格。
然后我在 RowDataBound 函数中添加了代码,以根据所选行显示网格。但问题是代码在填充函数之前自动运行 RowDataBound。所以第二个网格没有显示。
GridView 代码:
<asp:GridView style="width:75%"
ID="gvCVRT"
ShowHeaderWhenEmpty="true"
CssClass="tblResults"
runat="server"
OnRowDataBound="gvCVRT_RowDataBound"
OnSelectedIndexChanged="gridviewParent_SelectedIndexChanged"
DataKeyField="ID"
DataKeyNames="ChecklistID"
AutoGenerateColumns="false"
allowpaging="false"
AlternatingRowStyle-BackColor="#EEEEEE">
<HeaderStyle CssClass="tblResultsHeader" />
<Columns>
<asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField>
<asp:CommandField ShowSelectButton="True" HeaderText="Select" />
<asp:BoundField DataField="ChecklistDate" HeaderText="Checklist Date" dataformatstring="{0:dd/MM/yyyy}"></asp:BoundField>
<asp:BoundField DataField="User" HeaderText="User" ></asp:BoundField>
<asp:BoundField DataField="Note" HeaderText="Note" ></asp:BoundField>
</Columns>
</asp:GridView>
代码隐藏:
protected void gvCVRT_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
lookupCVRT work = (lookupCVRT)e.Row.DataItem;
GridView gv = sender as GridView;
if (work.ID != null)
{
int index = gv.Columns.HeaderIndex("Select");
if (index > -1)
{
e.Row.Cells[index].Attributes.Add("class", "gvCVRTRow");
e.Row.Cells[index].ToolTip = "Click here to Edit Checklist";
}
}
}
}
选择按钮代码:
protected void gridviewParent_SelectedIndexChanged(object sender, EventArgs e)
{
List<lookupCVRT> workDetails = lookupCVRT.GetChecklistItemsByChecklistID(Company.Current.CompanyID, ParentID.ToString(), gvCVRT.SelectedDataKey.Value.ToString());
gvCVRTDetails.DataSource = workDetails;
gvCVRTDetails.DataBind();
FireJavascriptCallback("setArgAndPostBack ();");
}
所以问题是,当我单击网格中的“选择”按钮时,它首先运行 RowDataBound
,然后运行 gridviewParent_SelectedIndexChanged
,但我需要运行 gridviewParent_SelectedIndexChanged
第一。我可以从 gridviewParent_SelectedIndexChanged
调用 RowDataBound
函数吗?
Page_Load 函数:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GetChecklistID = "";
if (ParentID.HasValue)
{
ViewState["ParentID"] = ParentID;
List<lookupCVRT> work = lookupCVRT.GetCVRTItems(Company.Current.CompanyID, ParentID.ToString());
ViewState["CVRT"] = work;
gvCVRT.DataSource = work;
gvCVRT.DataBind();
}
}
else
{
if (ViewState["ParentID"] != null)
{
ParentID = (int?)ViewState["ParentID"];
List<lookupCVRT> work = ViewState["CVRT"] as List<lookupCVRT>;
gvCVRT.DataSource = work;
gvCVRT.DataBind();
}
}
}
最佳答案
只有当 GridView
的 DataBind
方法被调用时,才会调用 OnRowDataBound
事件。
在您的特定情况下,问题出在 Page.IsPostBack
条件的 else
分支中的 Page_Load
中:
else
{
if (ViewState["ParentID"] != null)
{
ParentID = (int?)ViewState["ParentID"];
List<lookupCVRT> work = ViewState["CVRT"] as List<lookupCVRT>;
gvCVRT.DataSource = work;
gvCVRT.DataBind();
}
}
此代码针对每个回发运行。除非您在代码中的其他地方重置 ViewState["ParentID"]
,否则在每次回发时您都会再次绑定(bind) GridView gvCVRT
。这就是调用 RowDataBound
的原因。完成 Page_Load
后,页面会调用其他事件处理程序,在您的示例中为 gridviewParent_SelectedIndexChanged
。
为了解决这个问题,您需要更改 Page_Load
处理程序中的代码,以便不调用 DataBind
进行回发:
// field moved to class level so that you can access this variable instead of a DataRow in gvCVRT
private List<lookupCVRT> work;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GetChecklistID = "";
if (ParentID.HasValue)
{
ViewState["ParentID"] = ParentID;
work = lookupCVRT.GetCVRTItems(Company.Current.CompanyID, ParentID.ToString());
ViewState["CVRT"] = work;
gvCVRT.DataSource = work;
gvCVRT.DataBind();
}
}
else
{
if (ViewState["ParentID"] != null)
{
ParentID = (int?)ViewState["ParentID"];
work = ViewState["CVRT"] as List<lookupCVRT>;
}
}
}
问题的根本原因是您需要回发请求中的数据,并将这些数据放入 ViewState["CVRT"]
而不是重新请求数据。在 Web 应用程序中,为新请求再次读取数据是很常见的。因此,您可能会考虑是否真的需要将数据放入 ViewState 中,或者是否可以在从数据源回发时请求它们。
将数据放入 ViewState 会增加传输到客户端的页面的大小(基本上您有 GridView 的 HTML,此外您还有 ViewState 中的数据)。因此,在大多数情况下,重新请求它们是更好的方法。
关于c# - 从另一个函数调用 RowDataBound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35435604/
我有 2 个 Gridview。第一个网格有一个按钮,当单击该按钮时,它将使用基于所单击按钮的 ID 的数据填充第二个网格。 然后我在 RowDataBound 函数中添加了代码,以根据所选行显示网格
我希望有人能帮帮忙!我有一个具有 gridview 的用户控件(UC 中有一个更新面板) 我在 2 个不同的页面上使用这个 UC - 在这两个页面上,UC 都位于一个选项卡(ajax tabpanel
我有一个 gridview,如果选择了某个下拉列表项,我只想允许编辑文本框。在我的 RowDataBound 中,我得到了值并决定是否应该对其进行编辑,但是 .Visible 属性没有像我预期的那样工
我需要在事件 rowdatabound 中找到 gridview 中的总列数。有什么办法吗?下面是我的一些代码: protected void gvEmployee_RowDataBound(o
在 ASP.NET 页面上,我有一个填充了 LINQ 查询结果的 GridView。我在代码中设置 DataSource,然后对其调用 DataBind。在 GridView 的 RowDataBou
我有一个 rowdatabound 方法,它对两个 gridviews 是通用的。此方法的部分任务是将值分配给 GridView 的最后一列。 gridviews是一样的,但是两个gridviews的
我需要在 GridView 的 rowdatabound 事件的 DataControlRowType.Data 中获取列标题,我是这样做的: ((DataTable)((GridView)sende
我有一个 rowdatabound 方法,它对两个 gridviews 是通用的。此方法的部分任务是将值分配给 GridView 的最后一列。 gridviews是一样的,但是两个gridviews的
我有一个匿名类型的 GridView。我需要检查单元格中的值并在满足条件时突出显示该单元格。问题是,当我尝试从行的单元格中提取数据时,总是得到一个空字符串。我已成功突出显示所有单元格,并且已在 Vis
我可以在 GridView 中编辑单行。 但是,当在 MySQL 数据库中,字段 "card" 的值不为空时,我需要停止 GridView 的这一行中的编辑(并将该行传递到关闭的州)。 我尝试了这个解
我有一个 Asp.net Gridview,其中最后一列是我的总数,第 2-x 列是我的数字。 我想显示一个显示百分比的条形图 使用找到的示例 Displaying percentage bar wi
我已经添加了控件 if (e.Row.RowType == DataControlRowType.DataRow) { CheckBox chk = new Check
我在同一个页面中得到了两个gridview,它们基本上显示了相同类型的数据(不同的数量、相同的结构、相同的设计……)。 RowDataBound 里面有很多条件都是一样的(99%),所以我想减少代码。
我的网页上有一个 GridView,其数据源是一个在运行时填充的数据表。 GridView 的 AllowSorting 属性为 True。我已经成功地为此 GridView 实现了手动排序。 但我必
我在代码隐藏中创建了一个 gridview(因为它没有实际出现在页面上)。我想知道如何调用它的 rowdatabound 事件 - 因为数据已绑定(bind)到它。正好有一个Gv.RowDataBou
问题 我有一个绑定(bind)到项目表的 Gridview,其中一个属性为 clientid 和其他属性。现在我只想显示 clientid 等于给定 id 的特定行。 我有什么 Change Grid
ASP.net: ... ... C# 代码(在 RowDataDound 中用于 GridView): if (!string.IsNullOrEmpty(e.Row.Cells[4].Text)
触发 RowDataBound 事件,我的问题是如何提取 GridviewRowEventArgs e 的 DataKey? 我有一个 Publications 表,令人惊讶的是,键是 Publica
我正在处理一个 Web Forms 项目。这是一个旧的,这次添加了很多抽象。在我的一个页面上,我有一个带分页的 gridview。我正在尝试通过检查当用户转到下一个页面时当前 gridview 页面上
我的 GridView 中的 TemplateField 是这样创建的: ' ID="HiddenFieldGutscheinartID"/>
我是一名优秀的程序员,十分优秀!