2013-04-11 15 views
0

在一个ASP.Net web窗体中有一个GridView。我们希望在这个GridView中有一个固定大小的列,并且其中的文本也可以进行文字换行。我们无法实现它的工作。制作一个ASP.Net GridView列一个固定的大小并做文字换行

这里是我试过的标记:

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

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

我们认为这将使立柱偏出20个字符,使自动换行,但它没有做到这一点。

*更新*

它现在的工作基础上达伦的编码样本。这里是GridView和使用他的技术背后的代码的完整标记:

 <asp:GridView 
      ID="GridViewSummary" 
      runat="server" 
      AllowSorting="True" 
      AutoGenerateColumns="False" 
      DataKeyNames="ID" 
      Width="691px" 
      AllowPaging="True" 
      PageSize="5" 
      OnRowDataBound="GridViewSummary_RowDataBound"> 

      <Columns> 
       <asp:BoundField DataField="AssignmentDate" HeaderText="Date" 
        SortExpression="AssignmentDate" DataFormatString="{0:MM/dd/yyyy}"> 

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

       <asp:BoundField DataField="AssignmentDueDate" HeaderText="Date Due" 
        SortExpression="AssignmentDueDate" DataFormatString="{0:MM/dd/yyyy}"> 

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

       <asp:BoundField DataField="Class" HeaderText="Class" 
        SortExpression="Class"> 

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

       <asp:BoundField DataField="TeacherName" HeaderText="Teacher" 
        SortExpression="TeacherName"> 

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

       <asp:TemplateField HeaderText="Assignment" SortExpression="AssignmentDetails"> 
        <ItemTemplate> 
         <asp:Label ID="LabelAssignment" runat="server" Text='<%# Bind("AssignmentDetails") %>'></asp:Label> 
        </ItemTemplate> 

        <HeaderStyle HorizontalAlign="Left" /> 
        <ItemStyle HorizontalAlign="Left" Wrap="True" /> 
       </asp:TemplateField> 

       <asp:TemplateField ShowHeader="False"> 
        <ItemTemplate> 
         <asp:Button 
          ID="ButtonSelect" 
          runat="server" 
          CausesValidation="False" 
          CommandName="Select" 
          Text="Select Assignment Details" /> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 

代码隐藏:

Protected Sub GridViewSummary_RowDataBound(sender As Object, e As GridViewRowEventArgs) 

    ' Deal with Data type rows, and not headers etc. 
    '----------------------------------------------- 
    If (e.Row.RowType = DataControlRowType.DataRow) Then 

     Dim lblAssignment As Label = e.Row.FindControl("LabelAssignment") 

     ' Call a recursive method and insert a line break every 20 chars. 
     '---------------------------------------------------------------- 
     lblAssignment.Text = InsertlineBreak(lblAssignment.Text) 
    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 & "<br/>" & InsertlineBreak(secondString) 
     Else 
      Return original 
     End If 
    Else 
     Return original 
    End If 
End Function 

我也是在这个标记应用这个技术对我们的DetailsView控件以及所示和代码隐藏:

   <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 
+0

包装的实际字符将是最适合RowDataBound事件 - 基本上每20个字符添加一个换行符。 – Darren 2013-04-11 18:50:40

+0

感谢您的回复。你能展示编码样本吗? – 2013-04-11 18:55:13

+0

当然,一个来吧 – Darren 2013-04-11 19:17:14

回答

1

好的,物品宽度将不起作用,因为它是基于像素的,而不是像Jason所说的那样是基于字符的。

您需要在RowDataBound事件中为网格中的每一行处理此操作。

这个例子是在VB中,但将它转换为C#不会太难,你我确信。

在你的代码隐藏中做这样的事情 - 用你的网格名称替换“MyGridView”。

首先,将您的绑定字段更改为模板字段;更容易控制..并在模板中把Literal,将保留您的文字,称此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 

我没有测试此代码 - 我刚才敲起来,例如,但它会给你一个关于如何进行的想法。请不要复制/粘贴,然后发表评论,它不能立即开箱即用。需要了解更多信息才能提供确切的工作示例。 :)

+0

感谢Darren编码示例,也感谢在VB.Net中显示它,因为我不知道C#。我会试试看,并让你知道结果。 – 2013-04-12 12:38:36

+0

谢谢。它现在基于你的编码工作。我更新了发布。 – 2013-04-12 14:02:16

+0

不客气:)在这个RowDataBinding中你可以做很多事情。你会发现自己越来越多地使用它。 – Darren 2013-04-12 14:05:04

0

ItemStyle-Width设置列的像素宽度,而不是字符数。如果内容不能以20像素打包,则会扩展该列。

+0

感谢您的快速回复。我尝试了几个数字,如100,150和700,但列宽度从不改变大小。 – 2013-04-11 18:54:12

+0

默认情况下是在必要时进行换行。可能有其他的CSS风格干扰你正在尝试做的事情。你有没有像Firebug这样的工具检查过html? – 2013-04-11 19:03:52

+0

感谢您的回复。我为我们的GridView和DetailsView使用了Darren的技术。 – 2013-04-12 13:52:24

1

ItemStyle-CssClass="WrappedText",并在CSS做:

.WrappedText 
{ 
    word-break: break-all; 
    word-wrap: break-word; 
} 
相关问题