Zum Inhalt springen

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


informatikerin86

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

1. In einem Datagrid(view?) kann man die anzuzeigenden Spalten auch einzeln abschalten ohne das ganze SQL-Statement anzupassen. Dürfte theoretisch auch mit den Zeilen gehen.

2. DataGridView.CellValueChanged Event (System.Windows.Forms) dürfte hilfreich sein.

(Ich nehme zumindest an, dass du Zeilen/Spalten meintest, die nicht readonly sind. :beagolisc)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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???

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...