Da Sie zu einer „Text“ Datei schreiben, eine Möglichkeit, Text aufreihen ordnungsgemäß durchgeführt werden kann mit Leerzeichen wie andere vorgeschlagen haben. Dies würde erfordern, dass Sie für jede Spalte eine "definierte" Spalte "width" haben. Wenn Sie Ihr Bild als Beispiel verwenden, wäre die Spalte 0 (Null) "Gerätetyp" und wir könnten dieser Spalte eine maximale "Breite" von ... sagen, 25 (25) Zeichen breit. Spalte 2 "kwh" könnte mit einer maximalen Spaltenbreite von 15 usw. für jede Spalte eingestellt werden.
Wenn die "Spaltenbreiten" festgelegt sind, sollte es eine einfache Angelegenheit sein, die Anzahl der X Leerzeichen hinzuzufügen, die benötigt werden, um die Zeichenfolge in die Spaltenbreite zu füllen. Beispiel: Um sicherzustellen, dass Spalte 2 mit der nächsten Spalte 2 übereinstimmt, muss jede Spalte 1 Zeichenfolge die gleiche Länge haben. Wenn Sie jede Spalte mit einer Zeichenfolge mit Leerzeichen füllen, um die Zeichenfolge auf die Länge von Spalte 1 zu "füllen", wird sichergestellt, dass der Text der Spalte 2 korrekt ausgerichtet ist. Offensichtlich gilt die gleiche Logik für nachfolgende Spalten.
Die Methode GetBufferedString
(unten) demonstriert eine Möglichkeit, die Zeichenfolgen auf eine angegebene Spaltenbreite zu puffern. Die Methode verwendet eine Zeichenfolge originalString
, eine int maxLength
und einen Ausrichtungstyp. Die Methode gibt eine Zeichenfolge der Länge maxLength
so zurück, dass die Methode die angegebene Zeichenfolge mit Leerzeichen am Ende füllt, wenn der Ausrichtungstyp LEFT ist. Wenn der Ausrichtungstyp RIGHT ist, gibt die Methode eine Zeichenfolge maxLength
zurück, so dass Leerzeichen an der Vorderseite der Zeichenfolge hinzugefügt werden. Wenn der Ausrichtungstyp CENTER ist, gibt die Methode schließlich eine Zeichenfolge mit der Hälfte der Leerzeichen vor der Zeichenfolge und die andere Hälfte am Ende zurück. Wenn die Länge der angegebenen Zeichenfolge größer als maxLength
ist, ist die zurückgegebene Zeichenfolge eine maxLength
Kürzung der angegebenen Zeichenfolge.
Dies sollte Ihnen ermöglichen, jede Spaltenausrichtungsart unabhängig zu setzen. Der folgende Code setzt den Rechtentyp der Zeilen einfach nach rechts.
Dies ist ein Beispiel und ich hoffe, es hilft, aber es gibt keine Fehlerüberprüfung für eine mögliche Abweichung bei der Anzahl der tatsächlichen Spalten im Raster und die Anzahl der Spaltenbreiten.
Einige globale Variablen ... ein Integer-Array columnLengths
wird verwendet, um jede Spaltenbreite zu halten ... auch eine Aufzählung für den Ausrichtungstyp; RECHTS, LINKS, MITTE.
Dim columnLengths(6) As Integer
Enum JustifyType
LEFT
RIGHT
CENTER
End Enum
Set jeweils Spalten Breite ...
Private Sub FillColumnLength()
columnLengths(0) = 25
columnLengths(1) = 12
columnLengths(2) = 12
columnLengths(3) = 12
columnLengths(4) = 12
columnLengths(5) = 12
End Sub
Ein Speichern klicken Ereignis aktualisiert, um die GetBufferedString
Methode zu verwenden.
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Dim numCols As Integer = dgvApplianceList.ColumnCount
Dim numRows As Integer = dgvApplianceList.RowCount - 1
Dim strDestinationFile As String = "D:\Test\exportappliance.txt"
Dim tw As TextWriter = New StreamWriter(strDestinationFile)
Dim textToOutput = ""
For count As Integer = 0 To numCols - 1
textToOutput = GetBufferedString(dgvApplianceList.Columns(count).HeaderText, columnLengths(count), JustifyType.CENTER)
tw.Write(textToOutput)
Next
tw.WriteLine()
For count As Integer = 0 To numRows - 1
For count2 As Integer = 0 To numCols - 1
textToOutput = GetBufferedString(dgvApplianceList.Rows(count).Cells(count2).Value, columnLengths(count2), JustifyType.RIGHT)
tw.Write(textToOutput)
Next
tw.WriteLine()
Next
tw.Close()
End Sub
Schließlich die GetBufferedString
Methode.
Private Function GetBufferedString(originalString As String, maxLength As Int16, justifyType As JustifyType) As String
If (originalString.Length < maxLength) Then
Dim bufString = Space(maxLength - originalString.Length)
Select Case justifyType
Case JustifyType.LEFT
Return originalString + bufString
Case JustifyType.RIGHT
Return bufString + originalString
Case JustifyType.CENTER
Dim halfString = bufString.Substring(bufString.Length/2)
originalString = halfString + originalString
bufString = Space(maxLength - originalString.Length)
Return originalString + bufString
Case Else
Return ""
End Select
Else
Return originalString.Substring(0, maxLength)
End If
End Function
Hoffe, das hilft.
Sie tun nichts, um sie auszurichten, wie den Text in 'Feldern' oder virtuellen Spalten einer bestimmten Größe auffüllen. Bitte lesen Sie [ask] und nehmen Sie die [Tour] – Plutonix
Nehmen Sie die if-Anweisungen heraus, die Registerkarten einfügen, und verwenden Sie 'tw.Write (dgvApplianceList.Columns (count) .HeaderText.PadRight (20))', wenn Sie schreiben die flache Datei. Sie können die 20 mit der von Ihnen gewünschten Breite ersetzen oder sie je nach Spaltenindex ändern, wenn Sie unterschiedliche Spaltengrößen wünschen. – soohoonigan
Können Sie einfach die Zelle mit der größten Anzahl an Zeichen in jeder Spalte identifizieren und entsprechend auffüllen - jede Zelle enthält diese Anzahl der Zeichen vor dem Export? – ThatGuy