informatikerin86 Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 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) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 27. April 2009 Autor Teilen Geschrieben 27. April 2009 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?? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DominikJ Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 (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 27. April 2009 von DominikJ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 27. April 2009 Autor Teilen Geschrieben 27. April 2009 (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 27. April 2009 von informatikerin86 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DominikJ Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 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] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 27. April 2009 Teilen Geschrieben 27. April 2009 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? Das Event war von DataGridView. Sorry, die Gewohnheit... Pendant ist: DataGrid.CurrentCellChanged Event (System.Windows.Forms) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 27. April 2009 Autor Teilen Geschrieben 27. April 2009 (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 27. April 2009 von informatikerin86 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DominikJ Geschrieben 28. April 2009 Teilen Geschrieben 28. April 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 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??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DominikJ Geschrieben 28. April 2009 Teilen Geschrieben 28. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 (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 28. April 2009 von informatikerin86 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 28. April 2009 Teilen Geschrieben 28. April 2009 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* 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DominikJ Geschrieben 28. April 2009 Teilen Geschrieben 28. April 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 (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 28. April 2009 von informatikerin86 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DominikJ Geschrieben 28. April 2009 Teilen Geschrieben 28. April 2009 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" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
informatikerin86 Geschrieben 28. April 2009 Autor Teilen Geschrieben 28. April 2009 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!!!!!!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.