如何使用它在 vb.net 中添加内联值或多行字符串

how to use it to add in-lined values or multiline strings in vb.net

提问人:roy 提问时间:6/25/2022 最后编辑:roy 更新时间:6/27/2022 访问量:225

问:

我不知道创建一个多行字符串,请最好的解决方案。下面的代码并非都使用多行字符串。你可以看到我注释掉的代码是因为我不知道如何创建多行字符串。

谢谢杰克outwithmycode的信息代码

Public Shared Function GetReceipt(ByVal transaction_Conflict As Transaction) As String
            Return GenerateReceiptTemplate().Replace("<Orders/>", GetOrderRows(transaction_Conflict)).Replace("<Total/>", transaction_Conflict.Total.ToString() & "PHP").Replace("<Cash/>", transaction_Conflict.Cash.ToString() & "PHP").Replace("<Change/>", transaction_Conflict.Change.ToString() & "PHP").Replace("<Id/>", transaction_Conflict.Id).Replace("<Cashier/>", transaction_Conflict.GetCashier().Fullname).Replace("<Date/>", transaction_Conflict.Date.ToString())
        End Function

Private Shared Function GetOrderRows(ByVal transaction_Conflict As Transaction) As String
            Dim result As String = ""
            transaction_Conflict.GetOrders().ForEach(Sub(item As Order)
                result &= "<tr>"
                result &= "<td>" & item.GetProduct().Name & "</td>"
                result &= "<td align='center'>x " & item.Quantity & "</td>"
                result &= "<td align='right'>" & item.Subtotal & "PHP</td>"
                result &= "</tr>"
            End Sub)
            Return result
        End Function

 'code output in VB.NET
        
 Private Shared Function GenerateReceiptTemplate() As String
            Return "<center>" & vbCrLf &
                           "<font size='24px'><b>WcDonalds</b></font><br/>" & vbCrLf &
                           "<span>[email protected]</span>" & vbCrLf &
                       "</center>" & vbCrLf &
                       "<br/><br/>" & vbCrLf &
                       "<table width='100%'>" & vbCrLf &
                           "<thead>" & vbCrLf &
                               "<tr>" & vbCrLf &
                                   "<th align='left'>Product Name</th>" & vbCrLf &
                                   "<th align='center'>Quantity</th>" & vbCrLf &
                                   "<th align='right'>Subtotal</th>" & vbCrLf &
                               "</tr>" & vbCrLf &
                           "</thead>" & vbCrLf &
                           "<tbody>" & vbCrLf &
                               "<Orders/>" & vbCrLf &
                           "</tbody>" & vbCrLf &
                       "</table>" & vbCrLf &
                       "<br/>" & vbCrLf &
                       "<center>---------------------------------------</center>" & vbCrLf &
                       "<br/>" & vbCrLf &

            'Total: <b><Total/></b><br/>
            'Cash: <b><Cash/></b><br/>
            'Change: <b><Change/></b><br/>
            '               <br/>
            'Transaction ID:   #<Id/><br/>
            'Cashier: <Cashier/><br/>
            'Date: <Date/><br/>

            '               <br/>
            '               <center>---------------------------------------</center>
            '               <br/>

            '               <center><b>Thanks For visiting WcDonalds</b></center>





        End Function
vb.net visual-studio-2010 visual-studio-2012 多行字符串

评论

0赞 dr.null 6/25/2022
杰克先生,在HTML结构中没有效果也没有意义。不要混淆字符串操作和 HTML 元素和标签。使用标签来破坏HTML行,开始一个新段落。等。请参阅 HTML 元素参考vbCrLf<br /><p></p>
0赞 dr.null 6/25/2022
可以使用 StringBuilder 通过 [StringBuilder.AppendLine] 方法逐行创建 HTML 输出。
0赞 roy 6/25/2022
@dr.null ,这仅用于字符串操作。如果我使用 html 标签,则输出为空产品名称、数量和总数
0赞 roy 6/25/2022
@dr.null,相信你有能力、有经验,能为我提供解决方案和答案。
0赞 roy 6/25/2022
@dr.null ,从我发布的代码来看,它只剩下在我注释掉的代码中给出“vbCrLf”。因为它使用'total:',所以我仍然对使用'vbcrlf'感到困惑。如果注释掉之前的代码已成功为我提供打印输出。

答:

1赞 user18387401 6/25/2022 #1

您只需在多行上键入文字,第一行为左双引号,最后一行为右双引号。请注意,您需要将除第一行物理行之外的所有行都推到代码窗口的左侧,因为您包含的任何前导空格都将被视为 .例如StringString

    Dim str = "First Line
Second Line
Third Line"

我不记得这个功能是什么时候引入的,所以它可能在 VB 2010 中不可用。在这种情况下,您仍然可以使用 XML 文字,例如

    Dim str = <text>First Line
Second Line
Third Line</text>.Value

评论

0赞 roy 6/25/2022
,你能用我发布的代码回答吗
1赞 dbasnett 6/25/2022 #2

你的 HTML 一团糟。这只是好一点。

    Dim xe As XElement = <div>
                             <p style="text-align: center; font-size: 24px;font-weight:700;">WcDonalds</p>
                             <p style="text-align: center;">[email protected]</p>
                             <table style="width: 100%;">
                                 <thead>
                                     <tr>
                                         <th style="width: 33.3%; text-align: left;">Product Name</th>
                                         <th style="width: 33.3%; text-align: center;">Quantity</th>
                                         <th style="width: 33.3%; text-align: right;">Subtotal</th>
                                     </tr>
                                 </thead>
                                 <tbody>
                                     <tr>
                                         <td style="width: 33.3%; text-align: left;">a product</td>
                                         <td style="width: 33.3%; text-align: center;">1</td>
                                         <td style="width: 33.3%; text-align: right;">$1.23</td>
                                     </tr>
                                 </tbody>
                             </table>
                             <br/>
                             <p style="text-align: center;">---------------------------------------</p>
                             <p>Total</p>
                             <p>Cash</p>
                             <p>Change</p>
                             <p style="text-align: center;">---------------------------------------</p>
                             <p style="text-align: center; font-weight:700;">Thanks For visiting WcDonalds</p>
                         </div>

    Return xe.ToString

评论

0赞 roy 6/26/2022
谢谢你的回复,但你的回答代码与我的代码输出不同
0赞 dbasnett 6/27/2022
@Jack - 我不打算做这项工作,只是给你指出一个可能有帮助的方向。
0赞 roy 6/27/2022
我感谢你的努力和回答
1赞 Tu deschizi eu inchid 6/25/2022 #3

文本可以保存为嵌入资源(文本文件)并从那里检索。这有助于使代码看起来更干净。

请尝试以下操作:

VS 2010年:

打开解决方案资源管理器

  • 在 VS 菜单中,选择“视图
  • 选择“解决方案资源管理器

打开属性窗口

  • 在 VS 菜单中,选择“视图
  • 选择“属性”窗口

添加文件夹(名称:Templates)

  • 在“解决方案资源管理器”中,右击“<项目名称>
  • 选择“添加”
  • 选择“新建文件夹”
  • 键入所需的名称(例如:模板)

添加文本文件(名称:ReceiptTemplate.txt)

  • 在“解决方案资源管理器”中,右键单击刚刚创建的新文件夹(例如:模板)
  • 选择“添加”
  • 选择新项目
  • 展开 Common Items
  • 单击“常规
  • 选择文本文件(名称:ReceiptTemplate.txt)
  • 单击“添加”

设置文本文件的属性

  • 在“解决方案资源管理器”中,单击添加的文本文件(例如:ReceiptTemplate.txt)
  • 在“属性”窗口中,将“生成操作”设置为“嵌入资源”

将所需的文本添加到文本文件。例如:

收据模板.txt

<center>
  <font size='24px'>
    <b>ABC Cafe</b>
  </font>
  <br/>
  <span>[email protected]</span>
</center>

<br/>
<br/>

<table width='100%'>
    <thead>
        <tr>
            <th align='left'>Product Name</th>
            <th align='center'>Quantity</th>
            <th align='right'>Subtotal</th>
        </tr>
    </thead>
    <tbody>
        <Orders/>
    </tbody>
</table>
<br/>
<center>---------------------------------------</center>
<br/>

Total: <b><Total/></b><br/>
Cash: <b><Cash/></b><br/>
Change: <b><Change/></b><br/>
<br/>
Transaction ID:   #<Id/><br/>
Cashier: <Cashier/><br/>
Date: <Date/><br/>

<br/>

<center>---------------------------------------</center>
<br/>
<center><b>Thanks For visiting ABC Cafe</b></center>

添加模块(名称:HelperLoadResource.vb)

'Notes: 
'        Need to set property Build Action: Embedded Resource For Each file that 
'        needs to be loaded
'
'Resources: 
'        https'stackoverflow.com/questions/3314140/how-to-read-embedded-resource-text-file

Imports System.Text
Imports System.IO
Imports System.Reflection

Module HelperLoadResource

    Public Function ReadResource(filename As String) As String
        Return ReadResource(filename, System.Text.Encoding.UTF8)
    End Function

    Public Function ReadResource(filename As String, fileEncoding As System.Text.Encoding) As String
        Dim fqResourceName As String = String.Empty
        Dim result As String = String.Empty

        'get executing assembly
        Dim execAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

        'get resource names
        Dim resourceNames As String() = execAssembly.GetManifestResourceNames()

        If resourceNames IsNot Nothing AndAlso resourceNames.Length > 0 Then
            For Each rName As String In resourceNames
                If rName.EndsWith(filename) Then
                    fqResourceName = rName
                    Exit For
                End If
            Next

            If String.IsNullOrEmpty(fqResourceName) Then
                Throw New Exception(String.Format("Resource '{0}' not found.", filename))
            End If

            'get file text
            Using s As Stream = execAssembly.GetManifestResourceStream(fqResourceName)
                Using reader As StreamReader = New StreamReader(s, fileEncoding)

                    'read text
                    result = reader.ReadToEnd()
                End Using
            End Using
        End If

        Return result
    End Function
End Module

注意:这也适用于较新版本的 Visual Studio,但“添加文本文件”中列出的某些步骤有所不同。


文件/文件夹结构应类似于以下内容:

enter image description here


用法

Dim receiptTemplate As String = HelperLoadResource.ReadResource("ReceiptTemplate.txt")

资源

1赞 dr.null 6/27/2022 #4

好了,这里需要的就是生成和返回收据的第一个函数。我将使用相同的方法修改您上一个问题的答案,以从参数中获取值。XElementtransaction_Conflict

对于标签,将 用 括起来的对象中的相应值附加 。对于表部分,调用 in 方法以获取列表,并调用扩展方法创建行和单元格,如代码中所示。transaction_Conflict<%= %>transaction_Conflict.GetOrders()<%= %>.Select

Public Shared Function GetReceipt(ByVal transaction_Conflict As Transaction) As String
    Return <html>
                <center>
                    <font size='24px'><b>WcDonalds</b></font><br/>
                    <span>[email protected]</span>
                </center><br/>
                <table width='100%'>
                    <thead>
                        <tr>
                            <th align='left'>Product Name</th>
                            <th align='center'>Quantity</th>
                            <th align='right'>Subtotal</th>
                        </tr>
                    </thead>
                    <tbody>
                        <%= transaction_Conflict.GetOrders().Select(
                            Function(order)
                                Return _
                        <tr>
                            <td><%= order.GetProduct().Name %></td>
                            <td align='center'><%= order.Quantity %></td>
                            <td align='right'><%= order.SubTotal %></td>
                        </tr>
                            End Function) %>
                    </tbody>
                </table>
                <br/><hr/><br/>
            
                Total: <b><%= transaction_Conflict.Total %> PHP</b><br/>
                Cash: <b><%= transaction_Conflict.Cash %> PHP</b><br/>
                Change: <b><%= transaction_Conflict.Change %> PHP</b><br/><br/>
                Transaction ID: #<%= transaction_Conflict.Id %><br/>
                Cashier: <%= transaction_Conflict.GetCashier().Fullname %>><br/>
                Date: <%= transaction_Conflict.Date.ToString() %><br/><br/><hr/>

                <center><b>Thanks For visiting WcDonalds</b></center>
            </html>.ToString()
End Function

这在我的浏览器中生成如下内容:

SOQ72747486

评论

0赞 roy 6/27/2022
谢谢你的回复。但我有一个小错误 ProductName' 不是成员,Character 无效<td><%= order.ProductName %></td>$
0赞 dr.null 6/27/2022
@Jack啊,将其替换为 .并用字符串连接替换。请参阅修订版。<td><%= order.GetProduct().Name %></td>$
0赞 roy 6/27/2022
谢谢您的回复,好的,这不再是错误的,但对于字符无效<td><%= order.GetProduct().Name %></td>$
0赞 roy 6/27/2022
有没有其他解决方案可以替换角色,以便我可以在 vS 2012 中使用它?$
1赞 roy 6/27/2022
是的,没错,是一种货币.我已经使用了你运行完美的最后一次代码编辑PHP