我在ASP WebForm项目中有两个GridView,一个用于显示,一个用于编辑。我把它们分别放在一个Div中。我从Edit div看不见,并在显示div中有一个按钮,使显示div不可见,编辑div可见。基本代码如下所示:
<div id="DisplayDiv">
<asp:GridView ID="CertList" runat="server" AutoGenerateColumns="False" DataSourceID="GetMyData">
<Columns>
<asp:BoundField DataField="a few datafields go here />
</Columns>
</asp:GridView>
<asp:Button ID="btnEdit" runat="server" OnClick="btnEdit_Click" Text="Edit" />
</div>
<div id="EditDiv" visible="false">
<asp:GridView ID="CertList" runat="server" AutoGenerateColumns="False" DataSourceID="GetMyData" ">
<Columns>
<asp:BoundField DataField="a few datafields go here />
</Columns>
</asp:GridView>
</div>
按钮的点击事件如下所示:
protected void btnEdit_Click(object sender, EventArgs e)
{
EditDiv.Visible = true;
DisplayDiv.Visible = false;
}
如果我没有在标记中将EditDiv的visible属性设置为false,那么管道工作正常。如果我将其设置为false,那么当我在按钮单击事件中以编程方式将其设置回true时,表格不会显示。似乎DataView的呈现功能与访问标记的能力有关。因此,基于该理论,我尝试将位置设置为绝对值,将左侧设置为-10000,并得到相同的结果。
这只是我无法做到的事情,还是我错过了什么?
编辑:我把这个测试放在家里并且工作正常:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<div id="Div1" runat="server">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
DataKeyNames="CustomerID" DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="CustomerID" HeaderText="CustomerID" ReadOnly="True"
SortExpression="CustomerID" />
<asp:BoundField DataField="CompanyName" HeaderText="CompanyName"
SortExpression="CompanyName" />
<asp:BoundField DataField="ContactName" HeaderText="ContactName"
SortExpression="ContactName" />
<asp:BoundField DataField="ContactTitle" HeaderText="ContactTitle"
SortExpression="ContactTitle" />
</Columns>
</asp:GridView>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click"
Text="Button1" />
</div>
<div id="Div2" runat="server" visible="false">
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="SqlDataSource2">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitsInStock" HeaderText="UnitsInStock"
SortExpression="UnitsInStock" />
</Columns>
</asp:GridView>
<asp:Button ID="Button2" runat="server" onclick="Button2_Click"
Text="Button2" />
</div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT TOP (5) CustomerID, CompanyName, ContactName, ContactTitle FROM Customers">
</asp:SqlDataSource>
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT TOP (5) * FROM Products">
</asp:SqlDataSource>
</asp:Content>
背后的代码:
protected void Button1_Click(object sender, EventArgs e)
{
Div1.Visible = false;
Div2.Visible = true;
}
protected void Button2_Click(object sender, EventArgs e)
{
Div2.Visible = false;
Div1.Visible = true;
}
因此,这是一个概念证明。这可能是一个愚蠢的错误,但是一旦我发现故事是什么,我就会发布它。
答案 0 :(得分:0)
为两个div设置runat="server"
,然后尝试从后面的代码中访问。
<div id="DisplayDiv" runat="server">
....
</div>
<div id="EditDiv" runat="server" visible="false">
....
</div>
或者您可以使用asp:Panel
代替div
,然后您可以从后面的代码访问Visible
属性。
<asp:Panel Id ="PnlDisplay" runat="server">
....
</asp:Panel>
<asp:Panel Id ="PnlEdit" runat="server" Visible="false">
....
</asp:Panel>
你在后面编码
protected void btnEdit_Click(object sender, EventArgs e)
{
PnlDisplay.Visible = false;
PnlEdit.Visible = true;
}
答案 1 :(得分:0)
问题原来是由于我在SQLDataSource中有一个奇怪的想法。标记看起来像这样(注意:表中没有ID,值为0,这是一个虚拟值):
<asp:SqlDataSource ID="foo" runat="server"
ConnectionString="<%$ ConnectionStrings:BlahBlah %>"
SelectCommand="SELECT blahblahblabbertyblah from blah
WHERE ID = '0'>
</asp:SqlDataSource>
然后我的代码背后有这个小小的杰作:
protected void btnEdit_Click(object sender, EventArgs e)
{
DisplayDiv.Visible = false;
EditDiv.Visible = true;
string SqlSelect =
"SELECT c.CourseCode AS [Course Code], c.Description, ce.CertDate AS [Date Certified], ce.Recert, " +
"DATEADD(m, c.Period, ce.CertDate) AS [Expiration Date], e.DocLink, e.CertifiedTrainer, e.GroupLeader " +
"FROM Certifications c " +
"INNER JOIN CertificationEmployees ce ON c.ID = ce.CertID " +
"RIGHT JOIN Employees e ON ce.EmpID = e.ID " +
"WHERE e.ID = '" + EmployeeList.SelectedValue + "' " +
"ORDER BY [Course Code]";
EditCertifications.SelectCommand =
"SELECT blahblahblabbertyblah from blah " +
"WHERE e.ID = '" + aListImUsing.SelectedValue + "' " +
DataView eView = (DataView)EditCertifications.Select(DataSourceSelectArguments.Empty);
eTable = eView.ToTable();
//use the eView table to set various onscreen values
}
事实证明,每当我做任何需要更换屏幕的内容时,GridView都会神秘地消失。我向GridView添加了一个CommandField列,当我单击Edit按钮时,我将丢失GridView。原来,GridView为null。我想如果我以编程方式重新指定SelectCommand,它会持续存在。它没有;只要您在代码中指定它的范围超出范围,它就会恢复到标记中指定的那个。
修复是将WHERE子句中的虚拟值更改为我应该执行的参数,并将参数绑定到我使用的下拉列表中的当前值。我将WHERE子句更改为:
WHERE e.ID = @EmpID
并添加了这个:
<SelectParameters>
<asp:ControlParameter ControlID="EmployeeList" Name="EmpID" PropertyName="SelectedValue" />
</SelectParameters>
我的GridViews神奇地出现了。