0

ASP.Net Web フォームには GridView があります。この GridView の 1 つの列のサイズを固定し、その中のテキストでもワード ラップを行う必要があります。うまくいきません。

私が試したマークアップは次のとおりです。

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

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

これにより、列の幅が 20 文字になり、単語が折り返されると考えましたが、そうではありません。

* アップデート *

現在、Darren のコーディング サンプルに基づいて動作しています。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
4

3 に答える 3

1

わかりましたので、ジェイソンが述べているように文字ベースではなく、ピクセルベースであるため、アイテムの幅は機能しません。

グリッドの各行の RowDataBound イベントでこれを処理する必要があります。

この例は VB で書かれていますが、C# に変換するのはそれほど難しいことではありません。

コード ビハインドで次のようにします。「MyGridView」をグリッドの名前に置き換えます。

まず、バインドされたフィールドをテンプレート フィールドに変更します。はるかに簡単に制御できます..そのテンプレートに、Literalテキストを保持する a を配置し、この例ではこれを 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

私はこのコードをテストしていません。たとえば、コードをノックアップしただけですが、続行する方法についてのアイデアが得られます。そのままコピーして貼り付けてから、そのままでは機能しないとコメントしないでください。正確な実例を示すには、さらに知る必要があります。:)

于 2013-04-11T19:27:16.333 に答える
0

ItemStyle-Width文字数ではなく、列のピクセル幅を設定します。コンテンツを 20 ピクセルでラップできない場合は、列が拡張されます。

于 2013-04-11T18:49:18.857 に答える