如果在页面加载期间将容器div设置为不可见,则不会显示asp.net GridView表

时间:2014-10-03 22:09:35

标签: c# asp.net gridview webforms

我在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;
    }

因此,这是一个概念证明。这可能是一个愚蠢的错误,但是一旦我发现故事是什么,我就会发布它。

2 个答案:

答案 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神奇地出现了。