【发布时间】:2016-02-16 14:49:07
【问题描述】:
我有 2 个网格视图。第一个网格有一个按钮,当单击该按钮时,它将根据单击的按钮的 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();
}
}
}
【问题讨论】:
-
您能否将您的 Page_Load 方法和所有其他包含下降到 DataBind() 的方法发布?
-
@Markus 将 Page_Load 代码添加到我的问题中。这是唯一调用 DataBind 的地方。当我单击选择时,它进入方法的
else部分 -
谢谢;我想我已经发现了问题;请查看我的更新答案。
-
@Markus 好的,我已经更新了我的代码,但同样的事情仍在发生。它首先运行
OnRowDataBound,然后运行gridviewParent_SelectedIndexChanged函数 -
你能在调试器中跟踪代码吗?在您找到的每次调用
DataBind时设置一个断点。RowDataBound是调用DataBind的结果。