| |
VB.NET - Ein- und UmsteigerXML: suchen und ersetzen im Datagridview? | | | Autor: Krischan86 | Datum: 08.07.11 07:22 |
| Guten Morgen!
Ich habe in meinem Programm eine XML-Datenbank geladen (DataSet) und diese in einem Datagridview dargestellt. nun suche ich verzweifelt eine möglichkeit für eine "suchen und ersetzen"-funktion. am besten für die ausgewählte spalte, bzw. ausgewählte zellen. bin blutiger vb net anfänger und freue mich über jede hilfe. nutze das NET framework 4 | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Manfred X | Datum: 08.07.11 08:13 |
| Hallo!
Was meinst Du mit "in einem DatagridView dargestellt".
Gebunden?
Unter der Annahme, die Daten stehen in einer Datatable,
kannst Du die Rows-Auflistung der Table durchlaufen und in
der betreffenden Spalte jeweils den aktuellen Zeilen-Wert mit
dem Suchwert vergleichen und ihn ggf. ersetzen.
Kleine Demo:
Dim dtbl As New System.Data.DataTable
With dtbl
'Eine Spalte (Typ: String) und einige Testzeilen erstellen
.Columns.Add("Testspalte", GetType(String))
.Rows.Add("Finger weg")
.Rows.Add("Such mich")
.Rows.Add("Hau ab")
.Rows.Add("Such mich auch")
'Zeilen durchlaufen
For r As Integer = 0 To .Rows.Count - 1
If CType(.Rows(r).Item("Testspalte"), String).StartsWith("Such") Then
'Ersetzung durchführen
.Rows(r).Item("Testspalte") = "Hab Dich"
End If
Next r
End With Die Datentypen der Spalte, des Suchwertes und des Ersetzwertes müssen
kompatibel sein (im Beispiel: String).
MfG
Manfred
Beitrag wurde zuletzt am 08.07.11 um 08:16:26 editiert. | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Krischan86 | Datum: 08.07.11 09:37 |
| Zitat: | |
Was meinst Du mit "in einem DatagridView
dargestellt"
Gebunden?
| |
Was genau versteht man unter gebunden?
So schaut's bisher aus:
'Datei Laden
Private Sub LadenToolStripMenuItem_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles LadenToolStripMenuItem.Click
'wenn OK geklickt wird
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
'Listbox leeren
ListBox1.Items.Clear()
'datensatz leeren
DataSet1.Clear()
'datagridview neu laden
DataGridView1.Refresh()
'XML aus dem Dialog öffnen als DataSet
DataSet1.ReadXml(OpenFileDialog1.FileName)
'Listbox einträge aus der Tabellenzahl der XML Datei zählen
For i = 0 To DataSet1.Tables.Count - 1
'Eintrag hinzu
ListBox1.Items.Add(DataSet1.Tables(i).TableName)
Next
End If
End Sub
'dataGridview füllen
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
DataGridView1.DataSource = DataSet1.Tables(ListBox1.SelectedItem)
'Spalten automatisch anpassen
DataGridView1.AutoResizeColumns()
var_zeilenzahl = Convert.ToString(DataGridView1.RowCount - 1)
LabelZeilenZahl.Text = var_zeilenzahl
var_spaltenzahl = Convert.ToString(DataGridView1.ColumnCount - 1)
LabelSpaltenZahl.Text = var_spaltenzahl
End Sub | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Manfred X | Datum: 08.07.11 10:25 |
| Hallo!
"Gebunden" meint genau das was Du machst:
die Zuweisung einer Datatable auf die Datasource-Eigenschaft
eines DatagridView-Control.
Das Grid dient in dem Fall zur Anzeige, die Aufbewahrung der Daten
erfolgt in der Datatable.
Setze einfach:
dtbl = Dataset1.Tables(ListBox1.SelectedItem)
und Du kannst die Rows-Auflistung von dtbl für Suchen/Ersetzen in einer Spalte
durchlaufen, wie in meinem Beispiel von oben.
Alternativ kannst Du die Table an eine Instanz von "Bindingsource" binden
(DataSource) und die Filter-Methode verwenden, um die Zeilen auszuwählen,
die einem Suchmuster entsprechen.
MfG
Manfred
Beitrag wurde zuletzt am 08.07.11 um 10:27:50 editiert. | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Krischan86 | Datum: 08.07.11 10:45 |
| Danke sehr!
bin schon nen schritt weiter | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Krischan86 | Datum: 08.07.11 12:12 |
| Hello again Muss nochmal stören:
ich bekomme es nicht so zum laufen, wie ich mir das vorstelle...
ich möchte nämlich eine bestimmte zeichenfolge löschen, den rest der zelle aber beibehalten. nach manfreds methode wird die gesamte zelle ersetzt. mein ansatz wäre: zellinhalt in variable (string), variable "beschneiden", neue variable wieder in zelle schreiben, nächste reihe.. usw.
mit fehlen leider selbst die grundlegensten befehle in diesem zusammenhang und google spuckt nicht allzuviel aus...
hat evtl. jemand ne gute referenz zu dem thema dataset, datagridview und datatable, gerne auch für anfänger ? | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Code_mancer | Datum: 08.07.11 12:50 |
| Modifiziere diesen Part folgendermaßen:
If CType(.Rows(r).Item("Testspalte"), String).StartsWith("Such") Then
'Ersetzung durchführen
.Rows(r).Item("Testspalte") = .Rows(r).Item( _
"Testspalte").ToString.Replace("Such", "Ersetz")
End If --------------------
Ich habe keine besondere Begabung, sondern bin nur leidenschaftlich neugierig.
- Albert Einstein | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Krischan86 | Datum: 08.07.11 14:46 |
| Leider hab ich immernoch ein problem mit der durchführung, wie gehe ich mit so einer fehlermeldung um? und was bedeutet diese?
System.InvalidCastException wurde nicht behandelt.
Message=Ungültige Konvertierung von Typ DBNull in Typ String.
Source=Microsoft.VisualBasic
StackTrace:
bei Microsoft.VisualBasic.CompilerServices.Conversions.ToString(Object Value)
bei Eplan_P8_XML_Filter.Ersetzen.Button1_Click(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\c.klasen\Eigene Dateien\Visual Studio 2010\Projects\Eplan P8 XML Filter\Eplan P8 XML Filter\Ersetzen.vb:Zeile 16.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(ApplicationContext context)
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
bei Eplan_P8_XML_Filter.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
bei System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
bei System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
bei System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
bei System.Activator.CreateInstance(ActivationContext activationContext)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:
hier nochmal der code der das auslöst: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Dim dtbl As New System.Data.DataTable
dtbl = Form1.DataSet1.Tables(Form1.ListBox1.SelectedItem)
With dtbl
For r As Double = 0 To .Rows.Count - 1
If CType(.Rows(r).Item("P_ARTICLE_DESCR3"), String).StartsWith( _
"??_??@") Then
'Ersetzung durchführen
.Rows(r).Item("P_ARTICLE_DESCR3") = .Rows(r).Item( _
"P_ARTICLE_DESCR3").ToString.Replace("??_??@", "")
End If
Next r
End With
End Sub nicht wundern über den komischen spaltennamen und die fragezeichen, die xml die ich bearbeiten will entstammt einer cad-software (eplan p8, artikeldatenbank) | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Code_mancer | Datum: 08.07.11 15:01 |
| Vermutlich tritt das Problem hier auf:
CType(.Rows(r).Item("P_ARTICLE_DESCR3"), String) Mein Anhaltspunkt:
"Message=Ungültige Konvertierung von Typ DBNull in Typ String."
Du kriegst von der Datenbank ein Wert des Typs DBNull zurück. Der CType versucht, diesen als String zu "deklarieren" und fällt auf die Nase.
Versuch auch dort mal ein ".Rows(r).Item("P_ARTICLE_DESCR3").ToString"
--------------------
Ich habe keine besondere Begabung, sondern bin nur leidenschaftlich neugierig.
- Albert Einstein | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Manfred X | Datum: 09.07.11 06:00 |
| Hallo!
Manche Datenbank-Spalten erlauben es, dass in einer Zeile kein
Wert eingetragen ist. Das wird in Net als "DBNull(value)" wiedergegeben.
Um zu erkennen, ob in einer Zelle "kein Wert" eingetragen ist,
gibt es die Abfrage-Funktion IsDBNull.
Um in einem String einen Teilstring durch einen anderen zu ersetzen,
kannst Du die bewährte Funktion "Microsoft.Visualbasic.Replace" verwenden.
Sie erlaubt es unter anderem, als Parameter anzugeben, wie viele Ersetzungen
ab welcher Startposition vorgenommen werden sollen.
(Die Verwendung der ToString-Methode wird nicht empfohlen.
Die String.Replace-Methode ersetzt ALLE Vorkommen eines Teilstrings.)
Ich habe mein kleines Beispiel von oben ein wenig erweitert ....
Jetzt wird der Start-Teilstring "Suche" durch "Finde" ersetzt.
Dim dtbl As New System.Data.DataTable
With dtbl
.Columns.Add("Testspalte", GetType(String))
.Columns(0).AllowDBNull = True 'Diese Spalte erlaubt fehlende Werte
.Rows.Add("Finger weg")
.Rows.Add("Suche mich")
.Rows.Add("Hau ab")
.Rows.Add(DBNull.Value) 'In dieser Zeile fehlt ein Wert
.Rows.Add("Suche mich auch")
Dim cellcontent As String
For r As Integer = 0 To .Rows.Count - 1
If Not IsDBNull(.Rows(r).Item("Testspalte")) Then
cellcontent = DirectCast(.Rows(r).Item("Testspalte"), String)
If cellcontent.StartsWith("Suche") Then
cellcontent = Microsoft.VisualBasic.Replace _
(cellcontent, "Suche", "Finde", 1, 1, CompareMethod.Text)
.Rows(r).Item("Testspalte") = cellcontent
End If
End If
Next r
End With MfG
Manfred | |
Re: XML: suchen und ersetzen im Datagridview? | | | Autor: Krischan86 | Datum: 13.07.11 07:17 |
| Danke für eure Hilfe, klappt prima | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|