[英]GridView only displays information from the first row
我有兩個GridViews。 一個僅顯示日期,一個用戶,第二個顯示日期,每個項目旁邊都有一個復選框。
我已將gridview中的日期設置為鏈接,以查看第二個gridview,以便用戶可以看到哪些項目已被勾選。 問題是即使我選擇了第二行,它也只顯示第一行的信息。
在圖像中看到,我單擊了頂部GridView中的第二行。 但是第二個GridView中顯示的信息不是我單擊的行。 它應該顯示ID 395545的信息
我發現問題出在回發上:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
List<lookupCVRT> work = lookupCVRT.GetCVRTItems(Company.Current.CompanyID, ParentID.ToString());
ViewState["CVRT"] = work;
gvCVRT.DataSource = work;
gvCVRT.DataBind();
if (work.Count > 0)
{
string numberToView = gvCVRT.Rows[0].Cells[0].Text;
List<lookupCVRT> workDetails = lookupCVRT.GetChecklistItemsByChecklistID(Company.Current.CompanyID, ParentID.ToString(), numberToView.ToString());
gvCVRTDetails.DataSource = workDetails;
gvCVRTDetails.DataBind();
}
}
}
此代碼加載第一個GridView的信息,然后根據此GridView中的ID加載第二個GridView。 問題在於它僅加載第一行的ID。 因此,當它綁定第二個GridView時,它僅查看第一個ID。
有沒有辦法強制回發,以便為我選擇的行的ID重新加載第二個Grid?
這是GridView代碼:
<div id="divCVRT">
<fieldset class="groupbox" >
<div style="width:100%;">
<asp:UpdatePanel ID="udpCVRT" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:GridView style="width:75%"
ID="gvCVRT"
ShowHeaderWhenEmpty="true"
CssClass="tblResults"
runat="server"
OnRowDataBound="gvCVRT_RowDataBound"
DataKeyField="ID"
AutoGenerateColumns="false"
allowpaging="false"
AlternatingRowStyle-BackColor="#EEEEEE">
<HeaderStyle CssClass="tblResultsHeader" />
<Columns>
<asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField>
<asp:BoundField DataField="ChecklistDate" HeaderText="Checklist Date" dataformatstring="{0:dd/MM/yyyy}"></asp:BoundField>
<asp:BoundField DataField="User" HeaderText="User" ></asp:BoundField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
<asp:LinkButton title="Add CVRT" id="btnAddCVRT" OnClick="btnAddCVRT_Click" runat="server" style="cursor:pointer;">
<img src="../images/icons/buttons/basic1-072.png" />
</asp:LinkButton>
</div>
</fieldset>
</div>
<div id="divCVRTDetails" style="display:none">
<fieldset class="groupbox" >
<div style="width:100%;">
<asp:UpdatePanel ID="udpCVRTDetails" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<asp:GridView style="width:75%"
ID="gvCVRTDetails"
ShowHeaderWhenEmpty="true"
CssClass="tblResults"
runat="server"
OnRowDataBound="gvCVRTDetails_RowDataBound"
DataKeyField="ID"
AutoGenerateColumns="false"
allowpaging="false"
AlternatingRowStyle-BackColor="#EEEEEE">
<HeaderStyle CssClass="tblResultsHeader" />
<Columns>
<asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField>
<asp:BoundField DataField="Description" HeaderText="Checklist Items"></asp:BoundField>
<asp:TemplateField HeaderText ="Checked?" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox ID="chkChecked" runat="server" ></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="btnUpdateCVRT" />
<asp:AsyncPostBackTrigger ControlID="btnAddCVRT" />
</Triggers>
</asp:UpdatePanel>
<asp:LinkButton ID="btnUpdateCVRT" OnClientClick="CloseAddEditCVRT()" OnClick="btnUpdateCVRT_Click" runat="server" style="float:left" CssClass="btnSaveSmall" ></asp:LinkButton>
<a title="Close CVRT Details" id="btnCloseCVRTDetails" runat="server" class="btnCancelSmall" style="cursor:pointer; margin-left:40px">
</a>
</div>
</fieldset>
子GridView后面的代碼:
protected void gvCVRTDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
lookupCVRT work = (lookupCVRT)e.Row.DataItem;
GridView gv = sender as GridView;
e.Row.Attributes.Add("ID", "gvCVRTDetails_" + work.ID);
e.Row.Cells[0].Attributes.Add("onclick", "event.stopPropagation();");
HtmlGenericControl lnkShowHide = (HtmlGenericControl)e.Row.FindControl("lnkShowHide");
HyperLink ChecklistItem = (HyperLink)e.Row.FindControl("ID");
CheckBox chkChecked = e.Row.FindControl("chkChecked") as CheckBox;
chkChecked.Attributes.Add("onclick", "UpdateCheckedBox(" + work.ID.ToString() + ", this.value);");
chkChecked.Checked = work.Checked;
}
}
您沒有將子GridView與父GridView上的任何選擇動作綁定在一起,這就是為什么它不會顯示任何內容的原因。 您在Page Load上編寫的代碼將始終與父項的第一項綁定。
要解決此問題,您需要處理父GridView的OnSelectedIndexChanged,然后根據所選ID綁定子GridView。
查看更新的代碼(我刪除了Ajax代碼,因此將其重新發布到頁面):
<div id="divCVRT">
<fieldset class="groupbox" >
<div style="width:100%;">
<asp:GridView style="width:75%"
ID="gvCVRT"
ShowHeaderWhenEmpty="true"
CssClass="tblResults"
runat="server"
OnRowDataBound="gvCVRT_RowDataBound"
DataKeyField="ID"
DataKeyNames="ID"
OnSelectedIndexChanged="gridviewParent_SelectedIndexChanged"
AutoGenerateColumns="false"
allowpaging="false"
AlternatingRowStyle-BackColor="#EEEEEE">
<HeaderStyle CssClass="tblResultsHeader" />
<Columns>
<asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField>
<asp:BoundField DataField="ChecklistDate" HeaderText="Checklist Date" dataformatstring="{0:dd/MM/yyyy}"></asp:BoundField>
<asp:BoundField DataField="User" HeaderText="User" ></asp:BoundField>
<asp:CommandField ShowSelectButton="True" />
</Columns>
</asp:GridView>
<asp:LinkButton title="Add CVRT" id="btnAddCVRT" OnClick="btnAddCVRT_Click" runat="server" style="cursor:pointer;">
<img src="../images/icons/buttons/basic1-072.png" />
</asp:LinkButton>
</div>
</fieldset>
</div>
<div id="divCVRTDetails" style="display:none">
<fieldset class="groupbox" >
<div style="width:100%;">
<asp:GridView style="width:75%"
ID="gvCVRTDetails"
ShowHeaderWhenEmpty="true"
CssClass="tblResults"
runat="server"
OnRowDataBound="gvCVRTDetails_RowDataBound"
DataKeyField="ID"
AutoGenerateColumns="false"
allowpaging="false"
AlternatingRowStyle-BackColor="#EEEEEE">
<HeaderStyle CssClass="tblResultsHeader" />
<Columns>
<asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField>
<asp:BoundField DataField="Description" HeaderText="Checklist Items"></asp:BoundField>
<asp:TemplateField HeaderText ="Checked?" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox ID="chkChecked" runat="server" ></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:LinkButton ID="btnUpdateCVRT" OnClientClick="CloseAddEditCVRT()" OnClick="btnUpdateCVRT_Click" runat="server" style="float:left" CssClass="btnSaveSmall" ></asp:LinkButton>
<a title="Close CVRT Details" id="btnCloseCVRTDetails" runat="server" class="btnCancelSmall" style="cursor:pointer; margin-left:40px"></a>
</div>
</fieldset>
然后在后面的代碼中:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
List<lookupCVRT> work = lookupCVRT.GetCVRTItems(Company.Current.CompanyID, ParentID.ToString());
gvCVRT.DataSource = work;
gvCVRT.DataBind();
}
}
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();
}
更新:這是獲得想法的最小示例:Department是父表,類別是子表
<div>
<asp:GridView runat="server" ID="ParentGridView"
DataKeyNames="DepartmentId" AutoGenerateColumns="false"
OnSelectedIndexChanged="ParentGridView_SelectedIndexChanged">
<Columns>
<asp:BoundField DataField="DepartmentId" HeaderText="DepartmentId"></asp:BoundField>
<asp:BoundField DataField="DepartmentName" HeaderText="DepartmentName"></asp:BoundField>
<asp:BoundField DataField="DepartmentDescription" HeaderText="DepartmentDescription"></asp:BoundField>
<asp:CommandField ShowSelectButton="True" />
</Columns>
</asp:GridView>
<br />
<br />
<asp:GridView runat="server" ID="ChildGridView" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName"></asp:BoundField>
<asp:BoundField DataField="CategoryDescription" HeaderText="CategoryDescription"></asp:BoundField>
</Columns>
</asp:GridView>
</div>
后面的代碼:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataClasses1DataContext db = new DataClasses1DataContext();
var data = db.Departments.ToList();
ParentGridView.DataSource = data;
ParentGridView.DataBind();
}
}
protected void ParentGridView_SelectedIndexChanged(object sender, EventArgs e)
{
int key = int.Parse(ParentGridView.SelectedDataKey.Value.ToString());
DataClasses1DataContext db = new DataClasses1DataContext();
var data = db.Categories.Where(p => p.DepartmentId == key);
ChildGridView.DataSource = data;
ChildGridView.DataBind();
}
它應該可以根據需要工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.