当 AutoGenerateColumns="true" 时动态设置 gridview 列的宽度

Posted

技术标签:

【中文标题】当 AutoGenerateColumns="true" 时动态设置 gridview 列的宽度【英文标题】:Set Width of gridview columns dynamically when AutoGenerateColumns="true" 【发布时间】:2012-01-21 19:34:21 【问题描述】:

当我将属性 AutoGenerateColumns 设置为 AutoGenerateColumns="true" 时,我在设置 gridview 的宽度时遇到了问题。并且gridview在代码后面是数据绑定的。如果我使用的是 gridview1.columns(0).width 它会引发错误。

而且 GridView1.Columns.Count 始终为零,因为网格视图是数据绑定的。

在 .aspx 中:-

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true">
</asp:GridView>

在后面的代码中

Dim strCon As New SqlConnection("Data Source=myDataSource;Initial Catalog=myDataBaseName;Persist Security Info=True;User ID=GKRANJAN;Password=abcdef")
        Dim da As New SqlDataAdapter("Select * from myTableName", strCon)
        Dim ds As New DataSet
        da.Fill(ds)
        GridView1.DataSource = ds
        GridView1.DataBind()

因此 myTableName 有更多列,我不喜欢通过 BoundFiled 添加它们,因为它们在我的情况下有所不同。

在 GridView1_RowDataBound 我使用:-

Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
Dim cell As TableCell = e.Row.Cells(0)
            cell.Width = New Unit("200px")
    End Sub

但它对我不起作用。请帮帮我!!

谢谢大家!!

【问题讨论】:

提供完整的RowDataBound 方法体。你用If 子句检查了什么? @YuriyRozhovetskiy 抱歉,它是错误添加的。谢谢。 【参考方案1】:

我不知道它是否只是一个错字(或者你省略了它)但是你在 RowDataBound 部分的代码缺少 IF 部分..

但你在正确的轨道上。我,我用这样的东西,它一直有效

Protected Sub gvData_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvData.RowDataBound
     If e.Row.RowType = DataControlRowType.DataRow Then
            e.Row.Cells(0).Width = New Unit("200px")
            e.Row.Cells(1).Width = New Unit("500px")
     End If
 End Sub

但请记住,gridview 被呈现为一个表格。因此单元格会自行调整为最长的内容。

【讨论】:

我也遇到了同样的情况。桌子被调整了大小,所做的所有工作都变得毫无价值。 @noisyass2【参考方案2】:

我明白了。

下面是.aspx页面:-

<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" 

        style="table-layout:fixed;" Width="1000px">        

        <!-- Mind the above two lines to make this trick effective you must have to use both properties as is; -->

        </asp:GridView>
    </div>
    </form>
</body>

这是背后的代码:-

Imports System.Data.SqlClient
Partial Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim strCon As New SqlConnection("Data Source=myDataSource;Initial Catalog=myDataBaseName;Persist Security Info=True;User ID=GKRANJAN;Password=abcdef")
        Dim da As New SqlDataAdapter("Select * from myTableName", strCon)
        Dim ds As New DataSet
        da.Fill(ds)
        GridView1.DataSource = ds
        GridView1.DataBind()
    End Sub

    Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        If e.Row.RowType = DataControlRowType.Header Then

            'For first column set to 200 px
            Dim cell As TableCell = e.Row.Cells(0)
            cell.Width = New Unit("200px")

            'For others set to 50 px
            'You can set all the width individually

            For i = 1 To e.Row.Cells.Count - 1
                'Mind that i used i=1 not 0 because the width of cells(0) has already been set
                Dim cell2 As TableCell = e.Row.Cells(i)
                cell2.Width = New Unit("10px")
            Next
        End If
    End Sub
End Class 

实际上,当我们使用 boundfields 时,gridview 列的宽度会在我们设置每一列的宽度时在浏览器中呈现。我在两个项目中使用了两种方法 - 一种是通过 AutoGenerateColumns="false" 获取绑定字段,另一种是通过设置 AutoGenerateColumns = "true" - 分别在两个项目中,然后当页面在浏览器中呈现时,我使用“查看源代码“浏览器的功能,然后意识到这两种类型的主要区别是什么。区别在于: -

style="table-layout:fixed;" 

我还在我的 .aspx 页面的 gridview 标记处添加了以下行:-

style="table-layout:fixed;" Width="1000px" 

现在它工作正常。

谢谢大家!!

【讨论】:

对我来说,没有 : Width="1000px" 效果很好但也许是这样,因为我使用了类似 cell2.Width = New Unit("10%") 并计算每个单元格的宽度百分比。【参考方案3】:

如果您不打算将网格设置为固定模式(即,由于列数较多,预计会出现溢出行为),则上述解决方案的 style="table-layout:fixed;"不是合适的。

例如看下面的场景:

<div style="overflow:auto;">
 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"></asp:GridView>
</div>

在这种情况下,只需将单元格宽度设置为特定值并将单元格环绕设置为 False

Protected Sub gvData_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvData.RowDataBound
     If e.Row.RowType = DataControlRowType.DataRow Then
        e.Row.Cells(0).Width = New Unit("200px") 
        e.Row.Cells(0).Wrap = false
     End If
End Sub

【讨论】:

以上是关于当 AutoGenerateColumns="true" 时动态设置 gridview 列的宽度的主要内容,如果未能解决你的问题,请参考以下文章

在GridView AutoGenerateColumns中调整列的宽度以使文本适合页面

GridView问题

datagridview 手动添加列,前面的所有列都变没了

[Uva12563] Jin Ge Jin Qu hao (完全背包,dp)

DataGrid 创建 RadioButton 列

无法崩溃asp.net ajax Telerik gridtableview