为什么会自动生成额外的细胞?

Why extra cells generate automatically?

我的问题是,在我的 GridView 中,空单元格是自动生成的。我希望他们不要出现。我将 ShowHeaderWhenEmpty 和 AutoGenerateColumns 设置为 false,并且 TempateFields、ths 和 td 的数量相同秒。它是这样显示的:

当为空时,第一列上方有一个空单元格。

在 PostBack 之后,但仍然是空的,有一个空单元格占据了上面的整行。

但是,有数据就完美了。

我不能post图片,因为我的声望不够,但我希望你能想象和理解。

这是我的 aspx 代码:

<asp:GridView ID="GridViewCommentaires" runat="server" ShowHeaderWhenEmpty="false"
        ShowFooter="true" AutoGenerateColumns="false" BorderColor="Black">
        <Columns>

            <asp:TemplateField HeaderText="Date" ItemStyle-Width="100">
                <ItemStyle HorizontalAlign="Center" />
                <ItemTemplate>
                    <asp:HiddenField ID="HiddenFieldIdCommentaire" runat="server" Value='<%# Eval("[idCommentaire]") %>' />
                    <asp:Label ID="LabelCommentaireDate" runat="server" Text='<%# Convert.ToDateTime(Eval("dtHrEntree")).ToString("d") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox Width="100%" runat="server" ID="TextBoxCommentaireDate" Enabled="false"
                        BorderStyle="None" />
                </FooterTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Entré par" ItemStyle-Width="175">
                <ItemStyle HorizontalAlign="Center" />
                <ItemTemplate>
                    <asp:Label ID="LabelCommentaireModifiePar" runat="server" Text='<%# Eval("[modifieParComplet]") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox Width="100%" runat="server" ID="TextBoxCommentaireModifiePar" Enabled="false"
                        BorderStyle="None" />
                </FooterTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Commentaire" ItemStyle-Width="725">
                <ItemTemplate>
                    <asp:Label ID="LabelCommentaire" Width="700px" runat="server" Text='<%# Eval("[commentaire]") %>'></asp:Label>
                </ItemTemplate>
                <FooterTemplate>
                    <asp:TextBox Width="100%" ID="TextBoxCommentaire" runat="server" BorderStyle="None" />
                </FooterTemplate>
            </asp:TemplateField>

            <asp:TemplateField>
                <ItemTemplate>
                    <asp:LinkButton ID="LinkButtonSupprimerCommentaire" CssClass="ImageSupprimer" OnClick="LinkButtonSupprimerCommentaire_Click"
                        Text="" ToolTip="Supprimer" runat="server" ForeColor="Transparent" Width="16px"
                        Height="16px" OnClientClick="return confirm('Supprimer le commentaire ?')" />
                </ItemTemplate>
                <FooterTemplate>
                    <asp:LinkButton ID="LinkButtonAjouterCommentaire" CssClass="ImageSauvegarder" OnClick="LinkButtonAjouterCommentaire_Click"
                        Text="" ToolTip="Ajouter" runat="server" ForeColor="Transparent" Width="16px"
                        Height="16px" />
                </FooterTemplate>
            </asp:TemplateField>

        </Columns>

        <EmptyDataTemplate>
            <tr>
                <th scope="col">
                    Date
                </th>
                <th scope="col">
                    Entré par
                </th>
                <th scope="col">
                    Commentaire
                </th>
                <th scope="col">
                </th>
            </tr>
            <tr>
                <td style="width: 100px">
                    <asp:TextBox Width="100%" runat="server" ID="TextBoxCommentaireDate" Enabled="false"
                        BorderStyle="None" />
                </td>
                <td style="width: 175px">
                    <asp:TextBox Width="100%" runat="server" ID="TextBoxCommentaireModifiePar" Enabled="false"
                        BorderStyle="None" />
                </td>
                <td style="width: 725px">
                    <asp:TextBox Width="100%" ID="TextBoxCommentaire" runat="server" BorderStyle="None" />
                </td>
                <td align="center">
                    <asp:LinkButton ID="LinkButtonAjouterCommentaire" CssClass="ImageSauvegarder" OnClick="LinkButtonAjouterCommentaire_Click"
                        ToolTip="Ajouter" runat="server" ForeColor="Transparent" Width="16px"
                        Height="16px" />
                </td>
            </tr>
        </EmptyDataTemplate>
    </asp:GridView>

这很奇怪。我希望你能帮助我。提前致谢!

此行为的最可能原因是您收到的没有数据的标记不一致。 EmptyDataTemplate 用于定义空数据集显示的行的内容:

The empty data row is displayed in a GridView control when the data source that is bound to the control does not contain any records. You can define your own custom user interface (UI) for the empty data row by using the EmptyDataTemplate property.

所以我认为正在发生的事情是您的标记被插入到由 GridView 创建的 tr 标记内,因此给您这样的标记:

<table>                <-- comes from GridView
    <tr>               <-- comes from GridView
        <tr>           <-- comes from your template
            <th>...
        </tr>
        <tr>           <-- comes from your template
            <td>...
        </tr>

这很容易导致 UI 波动。

简单的解决方法,虽然我不是 100% 确定它会起作用,但将您的模板包装在适当的 <table> 标签中:

<EmptyDataTemplate>
    <table>
        <tr>...
    </table>
</EmptyDataTemplate>

如果您对 EmptyDataTemplate 的样式有疑问,请使用 EmptyDataRowStyle 控制其外观:

To control the style of the empty data row, use the EmptyDataRowStyle property.

另一种方法是重新考虑处理无数据情况的方式,也许完全隐藏 GridView 并显示一些内部带有文本框的面板。