Zum Inhalt springen

DataGrid - 2 Fragen - Zeilen sperren, was geändert


Empfohlene Beiträge

Geschrieben

Hallo Leute,

ich hatte die Hoffnung keine "Montags-Frage" eröffnen zu müssen. Nun klappt heute mittag leider doch nicht mehr alles so wie ich es gerne hätte.

Ich hab eine Anwendung mit VB.net programmiert die Daten aus einer Access-DB zieht.

Diese Daten werden in einem Fenster in einem DataGrid angezeigt.

Zum einen möchte ich, dass eine bestimmte Zeile angezeigt wird. Alle anderen sollen gesperrt werden (lesen ist ok).

Und zum anderen möchte ich herausfinden welche Zeilen am besten noch an welcher Stelle geändert wurden bevor sie per Update hochgeladen werden.

Das erste Problem könnte ich lösen indem ich in den DataAdpater nur diese eine Zeile einlese und in einem zweiten DataGrid anzeige, falls es keine andere Lösung gibt.

Das zweite Problem wäre wahnsinnig viel wichtiger. Das ist das einzige "must-have" das mir von meinem Chef vorgeschrieben wurde!! Ich muss es unbedingt so hinbekommen.

Viele Grüße

Informatikerin

Geschrieben

Danke für deine Antwort,

die Möglichkeit CellValueChanged gibt es in meiner .net 1.0 Version noch nicht wie ich auf der Seite gelesen habe.

Gibt es da noch eine andere Möglichkeit?

Wie kann ich einzelne Spalten im DataGrid abschalten ohne SQL zu verändern??

Geschrieben (bearbeitet)

Eins von den beiden evtl:


        DataGridView1.Columns(1).Visible = False

        DataGridView1.Columns(1).ReadOnly = True

(Je nachdem wie du es willst)

Edit:

eigtl wollte ich die gerade ein Workaround mit DataGridView.CellBeginEdit Event (System.Windows.Forms) und DataGridView.CellEndEdit Event (System.Windows.Forms) vorschlagen ... jedoch gibt es auch die noch nicht in 1.1 (gibt/gab es 1.0?) :(

Bearbeitet von DominikJ
Geschrieben (bearbeitet)

Ich bin gerade dabei mir eine aktuelle Version von Visual Studio runter zu laden. Die neue kann ich über msdn noch nicht haben, deswegen versuche ich es mal mit der express version.

Ich hoffe ich mache mir damit nicht noch mehr Schwierigkeiten :)

Vielleicht klappt dann einiges etwas einfacher.

Edit: Ja es gibt 1.0, die haben wir im Studium benutzt, so lange ist das aber noch nicht her...

Bearbeitet von informatikerin86
Geschrieben

Sehr gut :)

Ansonsten wäre das evtl. noch nen Workaround (du hast ja glaub ich nur eine editierbare Spalte):

Die Spalte duplizieren, vorm 'speichern' vergleichen und wenn Änderung hervorheben.

So in etwa:


'k.A. ob das so funzt 

        Dim newCol as Integer = DataGridView1.Columns.Add(DataGridView1.Columns(1).Clone())

        For i As Integer = 0 To DataGridView1.Rows.Count Step 1

            If DataGridView1.Rows(i).Cells("DEIN_SPALTEN_INDEX") = DataGridView1.Rows(i).Cells(newCol) Then

                DataGridView1.Rows(i).Cells("DEIN_SPALTEN_INDEX").Style.BackColor = Color.AliceBlue

            End If

        Next

[/code]

Geschrieben (bearbeitet)

Danke, diese Funktion hatte ich nach deiner ersten Hilfe viel später auch gefunden ;)

Soweit funktioniert sie auch.

Hier versuche ich dann herauszufinden welche Zelle es war. Dieser Code zeigt mir die Zelle mit dem Wert bevor er verändert wurde.

        Dim inttest As Integer

        Dim inttest2 As Integer

        inttest = DataGrid2.CurrentCell.RowNumber()

        inttest2 = DataGrid2.CurrentCell.ColumnNumber()


        Dim stTest As String


        stTest = DataGrid2.Item(inttest, inttest2)

Ich möchte natürlich den neuen Wert haben und am besten noch eine Zuordnung zum Primärschlüssel, damit man damit überhaupt etwas anfangen kann. Evtl. wäre auch nicht schlecht zu wissen aus welcher Spalte der Wert kommt um zu wissen was genau eigentlich geändert wurde.

Mir ist auch aufgefallen das ein Feld nicht richtig geändert werden muss damit das Event ausgelöst wird, es reicht das Feld anzuklicken. Kann man dagegen was machen??

Edit:

Wenn es klappt den alten und den neuen Wert zu bekommen dann erledigt sich das Problem mit dem Event das ohne Änderung ausgelöst wird von selbst!

Bearbeitet von informatikerin86
Geschrieben

Guten Morgen,

gestern abend hatten wir im Betrieb nen Serverabsturz, mein Programm musste da erst einmal hinten angestellt werden. Immerhin konnte ich nebenher Visual Studio Express installieren.

Ich hab mein Projekt jetzt konvertiert, es bringt mir einige Warnmeldungen, bis auf drei Ausnahmen sagen alle das ein Name (der automatisch generiert wurde) nicht CLS-kompatibel ist.

Die Anwendung läuft aber trotzdem. Ich schätze mal dann kann ich diese Warnungen ignorieren?!

Dann habe ich noch zwei Fragen:

1. Hat jemand vielleicht eine Antwort auf meine Frage von gestern abend? Das wäre wirklich wichtig, jetzt auch mit den neuen VB.net Klassen!

2. Kann ich das "Aussehen" der Anwendung nicht auch konvertieren? Im VB 2008 Express zeigt es mir das neue Desgin der Forms an, wenn ich es laufen lasse wird das alte Design angezeigt. An sich wäre es kein Problem mit dem alten Design, nur wenn ich neue Forms machen haben die das neue und das sieht dann wirklich komisch aus!

LG Informatikerin

Geschrieben

Hey,

also zu 1.

    Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged

        If Not init Then DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.red

    End Sub

init ist eine boolsche variable, welche ich beim initialisieren auf true setze, nachdem alle Elemente geladen sind auf false.

Zu 2. vermute ich, dass einfach die alten werte übernommen wurden. Diese müsstest du evtl. auf default werte zurücksetzen.

Geschrieben

Heute morgen klappt es nicht so wie ich es will :)

Das mit dem Design habe ich nicht hinbekommen, ich habe nichts gefunden. es wird ja auch anders angezeigt als es dann beim laufen aussieht...

Im schlimmsten Fall setzte ich mich zwei Tage hin und bastle die ganzen Forms neu, das wäre ein Spaß...

Wichtiger ist dann doch das mit dem DataGridView.

Ich möchte die Zelle wissen die geändert wurde, aber mit CurrentCell und allem was ich es probiert habe funktioniert es nicht. Wie kann ich denn den Wert bekommen der geändert wurde? Dazu dann am besten noch die Zuordnung zum Primärschlüssel. Weiß jemand wie das geht???

Geschrieben

Hmm,

was passiert denn bei meinem Lösungsvorschlag?

Bei mir highlighted er nach Änderung die entsprechende Zelle.

Wenn du nun eine Row highlighten willst oder ne andere spalte, bzw. dessen wert auslesen musst dui halt sowas wie:

If Not init Then msgbox(DataGridView1.Rows(e.RowIndex).Cells(PKID).value)

machen.

Bissl mehr input bitte

Geschrieben (bearbeitet)

sorry, das passiert wenn ich nicht richtig bei der Sache bin...

Deine Lösung kann ich nicht anwenden, da ich dem DataGridView die Daten eingebunden habe und nicht erst bei Load mitgebe. Ich wüsste dann nicht wo das init hin sollte!

Ich hänge gerade am DataGridView1_CellValueChanged

Das wird beim laden der Form anscheinend sofort aktiviert, denn meine Test-Msg-Box gibt mir etwas aus bevor sich alles daran aufhängt das er mir den wert nicht über:

            cellText1 = Me.DataGridView1.CurrentCell.Value

            zeilennr = Me.DataGridView1.CurrentRow.Index

rausfinden kann. Er sagt immer es wäre keine Methode und ich soll eine Objektinstanz mit New irgendwo festlegen...

Edit:

Eben ist mir aufgefallen das CellValueChanged noch vor dem Load aufgerufen wird. Ich schreibe in beiden Fällen etwas in eine Textdatei und der eintrag von Load kommt nach dem anderen.

Kann es sein das dieses CellValueChanged aufgerufen wird während meine Daten reingeladen werden??

Bearbeitet von informatikerin86
Geschrieben

Wichtiger ist dann doch das mit dem DataGridView.

Ich möchte die Zelle wissen die geändert wurde, aber mit CurrentCell und allem was ich es probiert habe funktioniert es nicht.

DataGridViewCellEventArgs.RowIndex-Eigenschaft (System.Windows.Forms)

DataGridViewCellEventArgs.ColumnIndex-Eigenschaft (System.Windows.Forms)

*hüstel* :rolleyes:

Wie kann ich denn den Wert bekommen der geändert wurde? Dazu dann am besten noch die Zuordnung zum Primärschlüssel. Weiß jemand wie das geht???

DatagridView("PKColumn", DataGridViewCellEventArgs.RowIndex)

Anmerkung:

Wie gesagt, ich mag kein DataGrid, also gleich DataGridView nehmen.

Geschrieben

du füllst irgendwo dein grid mit den daten.

danach musst du init auf false setzen.

und aus dem genannten grund hab ich ja eine init variable gesetzt, damit er beim laden der daten nid sagt, dass der wert verändert wurde.

Geschrieben (bearbeitet)

@Dominik: bei deiner init-Lösung gibt es einen ArgumentOutofRange-Fehler.

"Der index liegt außerhalb des Bereichs. Er muss nicht negativ oder kleiner als die Auflistung sein"

Ich benutze nun ja das DataGridView, hab ja extra auf die neue version umgestellt dewegen.

es klappt nicht und ich verstehe diese beiden beispiele auf msdn nicht... :(

Edit:

Bei dem init-Teil wird auch angezeigt, das der Eigenschaftszugriff einer Eigenschaft zugewiesen werden oder deren wert verwenden muss

Bearbeitet von informatikerin86
Geschrieben

Die ArgumentOutOfRange-Exception kommt, wenn das Grid noch leer ist.

D.h. du musst die passende Position für "init =false" finden.

Welche beiden Beispiele denn nun?

Du nutzt nun ja zum füllen vermutlich ".DataSource = deineDs"

Dahinter müsste vermutlich dann das "init = false"

Geschrieben

ich hab jetzt extra das füllen des DataGridViews aus den direkten Eigenschaften genommen und mache es beim laden, danach setze ich das init auf false

allerdings zeigt es mir immernoch denselben fehler bei:

 If Not init Then DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = Color.red

an. Das Grid müsste doch hier dann gefüllt sein, oder nicht?

Geschrieben

es klappt nun doch, besser es fragt mich keiner was das problem war, so langsam verstehe ich meinen eigenen code nicht mehr... :(

Jetzt fehlt nur noch der wert in der zeile in der die zelle aktiv ist aber da dann eine andere spalte, da versuche ich mich jetzt mal dran

Geschrieben

es funktioniert!!!!

DANKE DANKE DANKE an euch beide, ohne euch wäre ich dieses mal sicher verzweifelt!

Jetzt kann meine Präsentation in einer Stunde kommen, es klappt alles, vor allem die ach so wichtige Protokollierung!!!

Nochmal vielen vielen Dank!!!!!!!

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...