Hallo Jörn,
Post by Jörn JanzPost by Peter GötzWelchen DatenTyp hat das Feld "artnr" in "prodorders"?
beide Felder sind VARCHAR Felder
Gibt es einen zwingenden Grund dafür?
Wenn es sich wirklich nur um Nummern,
also Ziffern 0 ... 9 handelt, wäre es aus
vielerlei Gründen vorteilhaft, den FeldTyp in
z.B. Int32 zu ändern. Das spart u.a. Speicherplatz
und das suchen nach int32-Werten geht schneller
als das Suchen nach Strings.
Sollte ein num. Datentype aus irgendwelchen Gründen
nicht möglich sein, könntest Du evtl. in der Tabelle mit
den "kurzen"
Artikelnummer in einem einmaligen Durchlauf mit
führenden Nullen auffüllen und so Gleichheit in beiden
Tabellen herstellen.
Post by Jörn JanzGenau in diesen Bereichen liegen meine Lücken.
Was spricht gegen den SQL String?
Einen SQL-String hast Du auch bei Verwendung von
Parameter-Objekten, aber dieser SQL-String enthält
keine konkreten Wertangaben mehr, sondern nur
noch Platzhalter für die jeweiligen Werte. Die Werte
selbst übergibst Du an das jeweilige Paramter-Objekt
mit ihren tatsächlichen Datentypen, also ohne eine
Umwandlung in Strings, bei der es immer wieder
Probleme mit der richtigen Darstellung der Werte
(z.B. mit u. ohne Anführungszeichen, länderspezifische
Dezimaltrenner und Datumsformate usw., usw.)
Post by Jörn JanzIch möchte aber nur 3 Spalten angezeigt haben.
Ich bekomme doch dann in Deinem Beispiel im
DataGrid View die ganze Tabelle angezeigt, oder?
Dann kannst Du im einfachsten Fall gleich von vorneherein
Deine DataTable nur mit diesen 3 Feldern erstellen.
Brauchst Du aus irgendwelchen Gründen eine DataTable
mit mehr Feldern, dann kannst Du im einfachsten Fall
beim DataGridview eine oder mehrere Spalten ausblenden,
wie das nachfolgende Beispiel zeigt.
' /// Code in einer leeren Form
Public Class Form1
Private mDT As DataTable
Private mDV As DataView
Private WithEvents mCM As CurrencyManager
Private WithEvents DGV As DataGridView
Private WithEvents Timer1 As Windows.Forms.Timer
Private mRnd As Random
Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load
DGV = New DataGridView
With DGV
.SetBounds _
(10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height - 20)
.Anchor = AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom
.DefaultCellStyle.Font = _
New Font("Arial", 12)
.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)
End With
Me.Controls.Add(DGV)
mRnd = New Random
Timer1 = New Windows.Forms.Timer
End Sub
Private Sub Form1_Shown _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Shown
Dim i As Integer
CreateData()
DGV.DataSource = mDV
DGV.AutoResizeColumns()
For i = 0 To 3
If i <> 1 Then
DGV.Columns(i).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight
End If
Next
Dim W As Integer
For i = 0 To 3
W += DGV.Columns(i).Width
Next
Me.ClientSize = New Size(W + 85, Me.ClientSize.Height)
Timer1.Interval = 2000
Timer1.Start()
End Sub
Private Sub Form1_FormClosing _
(ByVal sender As Object, _
ByVal e As FormClosingEventArgs _
) Handles Me.FormClosing
Timer1.Stop()
Timer1.Dispose()
End Sub
Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow
mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Bezeichnung", GetType(String))
.Columns.Add("Menge", GetType(Integer))
.Columns.Add("Preis", GetType(Single))
For i = 1 To 25
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = GetText()
DR.Item(2) = mRnd.Next(0, 300)
DR.Item(3) = GetPrice()
.Rows.Add(DR)
Next
.AcceptChanges()
End With
mDV = New DataView(mDT)
mCM = _
DirectCast(Me.BindingContext(mDV), CurrencyManager)
End Sub
Private Function GetPrice() As Single
Dim Buffer As Double
Buffer = _
Math.Round(mRnd.Next(0, 25) + mRnd.NextDouble, 2)
Return CType(Buffer, Single)
End Function
Private Function GetText() As String
Dim i As Integer
Dim strBuffer As String = ""
Dim Max As Integer = mRnd.Next(5, 15)
For i = 1 To Max
strBuffer &= Chr(mRnd.Next(65, 90))
Next
Return strBuffer
End Function
Private Sub DGV_CellFormatting _
(ByVal sender As Object, _
ByVal e As DataGridViewCellFormattingEventArgs _
) Handles DGV.CellFormatting
If e.ColumnIndex = 3 Then
If e.Value IsNot DBNull.Value Then
e.Value = Format(e.Value, "0.00")
Else
e.Value = ""
End If
e.FormattingApplied = True
End If
End Sub
Private Sub Timer1_Tick _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Timer1.Tick
DGV.Columns(2).Visible = _
Not DGV.Columns(2).Visible
End Sub
End Class
' \\\ E N T E
Das Beispiel erzeugt eine DataTable mit zugehöriger
DataView und CurrencyManager (im Beispiel nicht
benutzt) und übergibt dem DataGridView-Control die
DataView (mDV) als Datasource. Der Timer Timer1
blendet eine der Spalten abwechselnd aus und ein.
Eine andere Möglichkeit, im DataGridView nur eine
Auswahl von mehreren Columns einer DataTable
anzuzeigen siehst Du im nachfolgenden Beispiel:
' /// Code in einer leeren Form1
Imports System.Text
Public Class Form1
Private WithEvents DGV As DataGridView
Private WithEvents mCM As CurrencyManager
Private mDT As DataTable
Private mDV As DataView
Private mR As New Random
Private Sub Form1_Load _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Load
CreateData()
CreateControls()
DGV.DataSource = mDV
DGV.AutoResizeColumns()
Me.Show()
ShowDataTable()
End Sub
Private Sub ShowDataTable()
Dim strBuffer As String = ""
For Each DR As DataRow In mDT.Rows
If strBuffer.Length = 0 Then
strBuffer = "ID; Text; Datum"
End If
strBuffer = strBuffer & ControlChars.CrLf & _
DR.Item(0).ToString & "; " & _
DR.Item(1).ToString & "; " & _
DR.Item(2).ToString
Next
MsgBox( _
strBuffer, _
MsgBoxStyle.Information, _
"DataTable (mDT)" _
)
End Sub
Private Sub CreateControls()
Dim i As Integer
Dim strBuffer As String
DGV = New DataGridView
With DGV
.Columns.Clear()
For i = 0 To 1
strBuffer = mDT.Columns(i).ColumnName
.Columns.Add(strBuffer, strBuffer)
.Columns(i).DataPropertyName = strBuffer
If i = 0 Then
.Columns(i).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight
Else
.Columns(0).DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleLeft
End If
Next i
.AutoGenerateColumns = False
.Bounds = New Rectangle _
( _
10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height - 20 _
)
.Anchor = AnchorStyles.Left Or _
AnchorStyles.Top Or _
AnchorStyles.Right Or _
AnchorStyles.Bottom
End With
Me.Controls.Add(DGV)
End Sub
Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow
mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns(0).Unique = True
.Columns.Add("Text", GetType(String))
.Columns.Add("Datum", GetType(Date))
For i = 1 To 20
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = GetRndText(5, 20)
DR.Item(2) = Now.AddDays(mR.Next(0, 30))
.Rows.Add(DR)
Next
.AcceptChanges()
End With
mDV = New DataView(mDT)
mCM = CType _
( _
Me.BindingContext(mDV), _
CurrencyManager _
)
End Sub
Private Function GetRndText _
( _
ByVal MinLen As Integer, _
ByVal MaxLen As Integer _
) As String
Dim i As Integer
Dim SB As New StringBuilder
Dim TextLen As Integer = mR.Next(MinLen, MaxLen)
For i = 1 To TextLen
SB.Append(Chr(mR.Next(97, 122)))
Next
Return StrConv(SB.ToString, VbStrConv.ProperCase)
End Function
End Class
' \\\ E N T E
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)