je to napisane len tak do notepadu, bez ziadnej kontroly, asi to budes musiet skontrolovat. tiez si budes musiet osetrit napriklad pripad ze jeden grid ma viac riadkov ako druhy (ak taka moznost teda moze nastat...)
No to co si poslal, tak porovnavam len 1:1 2:2 3:3...lenze ja potrebuje porovnat aj 1:3 1:2 atd..
Podla mna by som potreboval nieco taketo,ale to nefunguje vobec :
For i As Integer = 0 To songsDataGridView.Rows.Count
For j As Integer = 0 To songsDataGridView1.Rows.Count
If (songsDataGridView.Rows(i).Cells(8).Value = songsDataGridView1.Rows(j).Cells(8).Value) Then
' ked najdes zhodu, nepotrebujes ziadnu isFound premennu, proste das Continue
Continue For
End If
jaaj, ja som si doteraz myslel ze tych chces porovnavat iba hodnoty na rovnakych riadkoch.
tak potom to ozaj mozes robit aj cez for each, tak ako pises, akurat si tam zabudol pridat este samotne pridavanie toho riadku, teraz (ten kod co si sem napisal) akurat skontroluje ci je rovnaky, ziadny riadok nepridava.
len tam pridaj tento riadok, do toho vnoreneho for, ale az po if-e:
aacid napísal:jaaj, ja som si doteraz myslel ze tych chces porovnavat iba hodnoty na rovnakych riadkoch.
tak potom to ozaj mozes robit aj cez for each, tak ako pises, akurat si tam zabudol pridat este samotne pridavanie toho riadku, teraz (ten kod co si sem napisal) akurat skontroluje ci je rovnaky, ziadny riadok nepridava.
len tam pridaj tento riadok, do toho vnoreneho for, ale az po if-e:
For i As Integer = 0 To songsDataGridView.Rows.Count - 1
For j As Integer = 0 To songsDataGridView1.Rows.Count - 1
If songsDataGridView.Rows(i).Cells(8).Value = songsDataGridView1.Rows(j).Cells(8).Value Then
Continue For
songsDataGridView2.Rows.Add(songsDataGridView.Rows(i).Clone())
End If
Next
Next
no zmateny som teraz aj ja.
ja som si cely cas myslel ze ty chces porovnavat len rovnake riadky, teda prvy riadok s prvym riadkom, druhy s druhym, nie kazdy s kazdym.
potom sa celkom meni situacia a toto asi vobec nebude dobre...
takto by som si asi spravil kopie tych dvoch gridov (respektive len tej kolekcie Rows), zacal porovnavat, tak ako doteraz, akurat s tym ze vzdy ked by som nasiel zhodu, tak by som riadok aj z jednej aj z druhej kolekcie vymazal. no a na koniec by som tie dve kolekcie spojil do jednej a dostal by som vlastne vsetky riadky co sa nenachadzaju v oboch gridoch.
druha moznost je pouzit LINQ (tam je metoda Except(), ktora vrati vsetky hodnoty, ktore sa nachadzaju v jednej kolekcii ale nie druhej), ale to je uz trochu zlozitejsie a ked som to skusal nejak sa mi nejak nechceli spravne porovnavat tie dve kolekcie, s LINQ nemam az take skusenosti...
Tak myslim ze mi to uz funguje, ale nejako sa vyskytol s tym další problem. Ak za x dosadim cislo bunky, ktora obsahuje datum (vo formate dd.mm.yyyy) alebo cas (vo formate hh:mm:ss) tak mi to proste berie ho uvahy len dd alebo hh a za bodkou alebo dvojbodkou uz tie udaje nie
no skusil by som si ulozit obe tie hodnoty do premennej a debugovat preco sa porovnavaju tak ako sa porovnavaju. kedze do gridu bude datum asi ukladany ako string (ano? netusim takto z hlavy), tak mozno bude treba tie hodnoty najprv prekonvertovat na datetime (alebo nieco take) a porovnavat az tak...
Dalsi problem Tento kod exportuje DataGridView do csv a za kazdy stlpec dava ; Nevies mi nejako jednoducho poradit ako tam dat pevnu sirku stlpcov? Napr 1 bude mat 10 znakov, 2 15 znakov atd? Aby to exportovalo bez ; len pevne sirky
Dim rows = From row As DataGridViewRow In songsDataGridView2.Rows.Cast(Of DataGridViewRow)() _
Where Not row.IsNewRow _
Select Array.ConvertAll(row.Cells.Cast(Of DataGridViewCell).ToArray, Function(c) If(c.Value IsNot Nothing, c.Value, ""))
Using sw As New IO.StreamWriter("\\nm-fs01\it\Backup\IBEA\new.csv")
For Each r In rows
sw.WriteLine(String.Join(";", r))
Next
End Using
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(csvpath1)
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(";")
Dim currentRow As String() = "{0,-10} {1,10} {0,-10} {0,-10} {1,10}"
Dim riadok As Integer
While Not MyReader.EndOfData
Application.DoEvents()
Try
currentRow = MyReader.ReadFields()
riadok = riadok + 1
If (riadok > 1) Then
With songsDataGridView
.ColumnCount = 64
Dim row As String() = New String() {"21544a", currentRow(1), currentRow(2), currentRow(3), currentRow(4)}
.Rows.Add(row)
End With
End If
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & _
"is not valid and will be skipped.")
End Try
End While
End Using
ved si pisal ze chces z GridView exportovat do csv a teraz ten kod pouzivas pri importe...
ved sa pozri co robis, precitaj si ten error a musi ti byt jasne, ze ked Rows.Add() ocakava pole stringov a ty mu tam vlozis jeden dlhy string, tak ti to asi nepojde...
Moja chyba ale v podstate ak mi to da pri importe,tak mi to spravi aj pri exporte...spravil som to takto : currentRow(1).PadRight(20, " ") ... cize mi to napise moj text v bunke a pride do 20 prazdne znaky
ked to ide, tak dobre, ale pride mi zbytocne to davat formatovane uz do toho gridview, ked s tymi datami v gridview budes potrebovat nieco robit, tak ich tam budes mat s prazdnymi znakmi a budes to musiet trimovat...
To je pravda,ale exportovy kod na to nemam momentalne pripraveny a s tymito datami sa nic nebude robit,len ich potrebujem nacitat a vyexportovat...viem ze to neni elegantne riesenie,ale ak funguje,tak som rad
//autoeditácia príspevku (11 Mar 2013, 10:36)
Asi trochu mimo otazka, ale ako spravit tento kod tak, aby na konci toho kodu mohlo byt dgv2Row.Cells(6).Value ... potrebujem tam dostat udaj dgv2 ...
Dim isFound As Boolean
'Start iterating through datagridview1
For Each dgv1Row As DataGridViewRow In songsDataGridView.Rows
'and for each iteration through datagridview1 iterate through all of datagrid2
isFound = False
For Each dgv2Row As DataGridViewRow In songsDataGridView1.Rows
'compare each iteration of dgv1 with each iteration of dgv2
If (dgv1Row.Cells(8).Value = dgv2Row.Cells(8).Value) Then
'if there is a match, we don't want to add it so set Found
isFound = True
End If
Next
'only add to datagridview3 if isFound = false (meaning there was no
'match from the current row in dgv1 to any of the rows in dgv2)
If Not isFound Then
songsDataGridView2.Rows.Add(dgv1Row.Cells(0).Value, dgv1Row.Cells(1).Value, dgv1Row.Cells(2).Value, dgv1Row.Cells(3).Value, dgv1Row.Cells(4).Value, dgv1Row.Cells(5).Value, dgv2Row.Cells(6).Value)
End If
Next
a co tam chces mat z toho songsDataGridView1? pretoze ty porovnavas jeden riadok z GridView so vsetkymi riadkami z GridView1...
chces tam mat hodnotu z druheho gridu z rovnakeho riadku ako je v prvom gride? potom takto nejak:
//autoeditácia príspevku (03 Apr 2013, 13:12)
Caute. tento kod mi nacita csv subor do dataGrivView a dalsi csv pod neho...ja by som ale potreboval ich dat vedla seba do DataGV.Nejaka rada?
'Prve nacitanie
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(csvpath)
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(";")
Dim currentRow As String()
Dim riadok As Integer
While Not MyReader.EndOfData
Application.DoEvents()
Try
currentRow = MyReader.ReadFields()
riadok = riadok + 1
If (riadok > 1) Then
With songsDataGridView4
.ColumnCount = 4
Dim row As String() = New String() {currentRow(0), currentRow(1), currentRow(2), currentRow(3)}
.Rows.Add(row)
End With
End If
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & _
"is not valid and will be skipped.")
End Try
End While
End Using
'Druhe nacitanie
Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(csvpathnew)
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(";")
Dim currentRow As String()
Dim riadok As Integer
While Not MyReader.EndOfData
Application.DoEvents()
Try
currentRow = MyReader.ReadFields()
riadok = riadok + 1
If (riadok > 0) Then
With songsDataGridView4
.ColumnCount = 4
Dim row As String() = New String() {currentRow(0), currentRow(1), currentRow(2), currentRow(3)}
.Rows.Add(row)
End With
End If
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & _
"is not valid and will be skipped.")
End Try
End While
End Using