将ASP.NETGridView列设置为固定大小并进行文字换行

将ASP.NETGridView列设置为固定大小并进行文字换行,asp.net,gridview,word-wrap,fixed-width,Asp.net,Gridview,Word Wrap,Fixed Width,在ASP.NETWeb表单中有一个GridView。我们希望此GridView中的一列有一个固定的大小,并且其中的文本也要进行换行。我们不能让它工作 以下是我尝试过的标记: <asp:BoundField DataField="AssignmentDetails" HeaderText="Assignment" SortExpression="AssignmentDetails" ItemStyle-Width="20" ItemStyle-Wrap="true">

在ASP.NETWeb表单中有一个GridView。我们希望此GridView中的一列有一个固定的大小,并且其中的文本也要进行换行。我们不能让它工作

以下是我尝试过的标记:

<asp:BoundField DataField="AssignmentDetails" HeaderText="Assignment" 
    SortExpression="AssignmentDetails" ItemStyle-Width="20" ItemStyle-Wrap="true">

    <HeaderStyle HorizontalAlign="Left" />
    <ItemStyle HorizontalAlign="Left" />
</asp:BoundField>

ItemStyle Width
设置列的像素宽度,而不是字符数。如果内容不能用20像素包装,它将扩展列。

好的,因此项目宽度将不起作用,因为它是基于像素的,而不是Jason所说的基于字符的

您需要在网格中每一行的RowDataBound事件中处理此问题

这个例子是用VB编写的,不过我相信把它转换成C语言对你来说不会太难

在您的代码隐藏中,执行以下操作-将“MyGridView”替换为网格的名称

首先,将绑定字段更改为模板字段;更容易控制。。在这个模板中放一个
文本
,它将保存文本,在这个例子中称之为MyLit

Private Sub MyGridView(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles MyGridView.RowDataBound
        '' only want to deal with Data type rows, and not headers etc
        If (e.Row.RowType = DataControlRowType.DataRow) Then

             '' get this instance of the object you're binding (assuming object is Assignment)
             Dim assignment As Assignment = CType(e.Row.DataItem, Assignment)
             '' now get the literal control where you will be putting your text
            Dim MyLit as Literal = row.FindControl("MyLit")

            '' you can now call a recursive method and insert a line break every 20 chars
            MyLit.Text = InsertlineBreak(assignment.TextToSplitUp)

        End If

End Sub


 Function InsertlineBreak(ByVal original As String) As String
        Dim MaxStringLength As Int16 = 20

        If original.Length > MaxStringLength Then
            Dim indexOfSpace = original.IndexOf(" ", MaxStringLength - 1)
            If indexOfSpace <> -1 AndAlso indexOfSpace <> original.Length - 1 Then
                Dim firstString As String = original.Substring(0, indexOfSpace)
                Dim secondString As String = original.Substring(indexOfSpace)

                Return firstString & Chr(10) & InsertlineBreak(secondString)
            Else
                Return original
            End If
        Else
            Return original
        End If
    End Function
私有子MyGridView(ByVal sender作为对象,ByVal e作为System.Web.UI.WebControl.GridViewRowEventArgs)处理MyGridView.RowDataBound
“”只希望处理数据类型行,而不希望处理标头等
如果(e.Row.RowType=DataControlRowType.DataRow),则
“”获取要绑定的对象的此实例(假定对象为赋值)
Dim assignment As assignment=CType(例如,Row.DataItem,assignment)
“”现在获取文本控件,您将在其中放置文本
Dim MyLit as Literal=row.FindControl(“MyLit”)
“”您现在可以调用递归方法并每20个字符插入一个换行符
MyLit.Text=InsertlineBreak(assignment.TextToSplitUp)
如果结束
端接头
函数InsertlineBreak(ByVal原始为字符串)为字符串
尺寸MaxStringLength为Int16=20
如果原始.Length>MaxStringLength,则
Dim indexOfSpace=original.IndexOf(“”,MaxStringLength-1)
如果indexOfSpace-1,并且indexOfSpace original.Length-1,则
Dim firstString作为String=original.Substring(0,indexOfSpace)
Dim secondString As String=original.Substring(indexOfSpace)
返回第一个字符串&Chr(10)&InsertlineBreak(第二个字符串)
其他的
归还原件
如果结束
其他的
归还原件
如果结束
端函数

我还没有测试过这段代码——例如,我刚刚完成了这段代码,不过它会告诉您如何继续。请不要只是复制/粘贴,然后评论它不能立即工作。需要了解更多信息才能给出准确的工作示例。:)

设置
ItemStyle CssClass=“WrappedText”
,并在CSS中执行以下操作:

.WrappedText
{
  word-break: break-all;
  word-wrap: break-word;
}

按实际字符换行最适合rowdatabound事件-基本上每20个字符添加一个换行符。感谢您的回复。你能展示一下编码样本吗?当然,一个正好向上,你的网格宽度是多少?共享GridView的完整标记。感谢您的快速回复。我尝试了几个数字,如100、150和700,但列宽永远不会改变大小。默认值是在必要时换行。可能会有其他css样式干扰您尝试执行的操作。你在Firebug这样的工具中检查过html吗?谢谢你的回复。我在GridView和DetailsView中使用了Darren的技术。感谢Darren提供的编码示例,也感谢在VB.Net中显示它,因为我不懂C。我会试试看,然后告诉你结果。谢谢。它现在正在根据您的编码工作。我更新了帖子。不客气:)在RowDataBinding中你可以做很多事情。你会发现自己越来越多地使用它。
                <asp:TemplateField HeaderText="Details:" SortExpression="AssignmentDetails">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBoxAssignmentDetails" runat="server" Text='<%# Bind("AssignmentDetails") %>' TextMode="MultiLine"
                            rows="5"></asp:TextBox>
                    </EditItemTemplate>

                    <InsertItemTemplate>
                        <asp:TextBox ID="TextBoxAssignmentDetails" runat="server" Text='<%# Bind("AssignmentDetails") %>' TextMode="MultiLine"
                            rows="5"></asp:TextBox>
                    </InsertItemTemplate>

                    <ItemTemplate>
                        <asp:Label 
                            ID="LabelAssignmentDetails" 
                            runat="server" 
                            Text='<%# Bind("AssignmentDetails") %> '
                            OnDataBinding="LabelAssignmentDetails_DataBinding">
                        </asp:Label>
                    </ItemTemplate>

                    <ItemStyle ForeColor="Blue" />
                </asp:TemplateField>
Protected Sub LabelAssignmentDetails_DataBinding(sender As Object, e As EventArgs)

    Dim lblAssignment As Label = DetailsView.FindControl("LabelAssignmentDetails")

    ' Call a recursive method and insert a line break every 20 chars.
    '----------------------------------------------------------------
    lblAssignment.Text = InsertlineBreak(lblAssignment.Text)
End Sub
Private Sub MyGridView(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles MyGridView.RowDataBound
        '' only want to deal with Data type rows, and not headers etc
        If (e.Row.RowType = DataControlRowType.DataRow) Then

             '' get this instance of the object you're binding (assuming object is Assignment)
             Dim assignment As Assignment = CType(e.Row.DataItem, Assignment)
             '' now get the literal control where you will be putting your text
            Dim MyLit as Literal = row.FindControl("MyLit")

            '' you can now call a recursive method and insert a line break every 20 chars
            MyLit.Text = InsertlineBreak(assignment.TextToSplitUp)

        End If

End Sub


 Function InsertlineBreak(ByVal original As String) As String
        Dim MaxStringLength As Int16 = 20

        If original.Length > MaxStringLength Then
            Dim indexOfSpace = original.IndexOf(" ", MaxStringLength - 1)
            If indexOfSpace <> -1 AndAlso indexOfSpace <> original.Length - 1 Then
                Dim firstString As String = original.Substring(0, indexOfSpace)
                Dim secondString As String = original.Substring(indexOfSpace)

                Return firstString & Chr(10) & InsertlineBreak(secondString)
            Else
                Return original
            End If
        Else
            Return original
        End If
    End Function
.WrappedText
{
  word-break: break-all;
  word-wrap: break-word;
}