gpt4 book ai didi

c# - 从另一个函数调用 RowDataBound

转载 作者:太空狗 更新时间:2023-10-29 20:38:48 27 4
gpt4 key购买 nike

我有 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();

}
}
}

最佳答案

只有当 GridViewDataBind 方法被调用时,才会调用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com