Autor Beitrag
RBS2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Fr 10.09.10 12:16 
Hi,

kurz und schmerzlos - wie bringe ich einer dataGridView dazu das sie, wenn noch keine Reihe vorhanden war und ein neuer hinzugefügt wird, nicht gleich automatisch die erste Reihe markiert. Wie gesagt - ist so etwas möglich und wenn ja wie?

Vielen Dank im Voraus,
mfG RBS2002
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Fr 10.09.10 17:35 
Hi,

wie fügst Du denn die Zeilen hinzu?
Reicht es nicht, wenn Du nach dem Hinzufügen
ausblenden C#-Quelltext
1:
dataGridView1.ClearSelection();					

aufrufst?

Marko
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Fr 10.09.10 20:07 
Es ist im Prinzip egal - einmal über BindView und einmal, über die der DataGridView zugeordnete Datatable, per Add Funktion. Bei beiden macht die Datagridview das selbe, sprich - es wird der erste Eintrag sofort markiert (wenn Tabelle vorher leer). Das ClearSelection hilft mir nicht wirklich da es sowieso gesetzt wird - im Ernstfall könnte dann ein anderer Benutzer das Element bearbeiten und der Benutzer bekommt dann, obwohl er nur das entsprechende Panel geöffnet und von sich aus keinen Eintrag markiert hat gleich die Meldung das er, zum jetzigen Zeitpunkt, nur lesend auf die Daten zugreifen kann. Das ist kein Weltuntergang, aber eigentlich unschön und nicht wirklich benutzerfreundlich (frage mich eh was Microsoft da wiederfahren ist das automatisch einzubauen, aber ich habe bisher keine Möglichkeit gefunden das abzustellen)
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Fr 10.09.10 21:20 
Habe mal was ausprobiert. Habe mir eine Klasse geschrieben, die von DataGridView erbt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public class CustomDataGridView : DataGridView
{
  public void SetRowSelection(int rowIndex, bool selected)
  {
    base.SetSelectedRowCore(rowIndex, selected);
  }
}

Durch Aufruf der Methode "SetRowSelection" kann nun gesagt werden, dass beim Einfügen eines Elementes die Zeile auf unselected gesetzt werden soll. Macht natürlich nur Sinn, wenn das der erste Eintrag ist, der hinzugefügt wrid.

Würde das denn Dein Problem lösen?

Marko

Für diesen Beitrag haben gedankt: RBS2002
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Fr 10.09.10 21:22 
Danke, ich werde das mal ausprobieren und mich sofort melden wenn es funktioniert (oder nicht ;))
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 13.09.10 13:34 
Leider bringt das ganze nichts - bzw. es wird immer wieder die erste Zeile markiert (als wenn das Steuerelement davon abhängig währe) Wenn ich das im Voraus einsetelle (wie es sein soll, es bringt mir ja nichts wenn ich er es zu Beginn markiert und danach demarkiert - die eventuelle Meldung das, dass Element gerade von einem anderen Benutzer bearbeitet wird würde ja in dem Fall bei der automatischen Markierung - auf die der Benutzer keinen Einfluss hat - reagieren) meckert er natürlich das der Index zu groß ist (es sind ja auch noch keine Reihen vorhanden), wenn ich es mit

dataGridView1.SetRowSelection(0, false);

abstellen will (nachdem etwas hinzugefügt wurde - über Add oder Filter) bleibt die erste Reihe trotzdem markiert (so könnte man es ja über eine Boolean Variable regeln die erst aktiviert wird wenn die Zeile demarkiert wurde).

Aber trotzdem erstmal vielen Dank ;)
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 13.09.10 14:51 
Das ist schade. Aber mal eine andere Frage: Du gibst also eine Meldung aus, wenn der Benutzer eie Zelle markiert, die gerade durch einen anderen Benutzer bearbeitet wird?

Wäre es dann vielleicht nicht besser, erst die Meldung auszugeben, wenn der Benutzer einen Wert wirklich ändern will, z.B. beim Event
ausblenden C#-Quelltext
1:
CellBeginEdit					

Dann könntest Du, wenn der Datensatz in Bearbeitung ist, das Event abbrechen und eine entsprechende Meldung ausgeben. Ohne natürlich zu wissen, wie Deine Anforderungen sind. Aber ich würde es als Benutzer irgendwie störend finden, wenn jedesmal eine Meldung aufpoppt, nur wenn irgendwas selektiert wird.

Marko
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 13.09.10 15:31 
In der Tabelle wird ja nichts editiert, sie ist nur eine Art Navigation (in ListBoxen kann man ja, meines Wissens nach, nicht mehrere Spalten setzen).
Seltsamerweise bringt es auch nichts wenn ich ein ClearSelection() nach dem Laden und Einbinden der Daten aufrufe - die Markierung bleibt trotzdem (so könnte man das, wie vorher gesagt, noch als Boolean Variable regeln). Normalerweise wird auch in dem Dialog gefragt ob man lesend auf die Daten zugreifen will - im Hintergrund wird dann ein Thread gestartet der zyklisch den aktuellen Status (frei/nicht fei) abfragt und das Element sofort, wenn es wieder freigegeben wurde (durch Deselektion des Eintrags/Wechsel des Panels/Verlassen des Programmes) für den Benutzer reserviert/freigibt der momentan noch Leserechte hat (bzw. nach dem Prinzip "wer richtig abfragt, bekommt zuerst - falls mehr als 2 Personen an einem Element hocken). Ansonsten wird es sofort deselktiert. Natürlich wird auch abgefragt ob es der gleiche Benutzer am gleichen Rechner ist - nicht das dem einmal das Programm oder der PC abschmiert und es für immer gesperrt bleibt :D
Bei den Listboxen funktioniert das alles einwandfrei - nur leider fehlen mir dort die Spalten, ansonsten währe das in dem Fall zu unübersichtlich und zu vielschichtig.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Di 14.09.10 08:49 
user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
in ListBoxen kann man ja, meines Wissens nach, nicht mehrere Spalten setzen

Und wie siehts mit einer ListView aus? Dort können mehrere Spalten angezeigt werden. Was aber immer noch nicht erklärt, warum das mit dem DataGridView so bescheiden ist...
RBS2002 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 20.09.10 13:33 
So, ich konnte das ganze über ein paar Umwege lösen. Wer ebenfalls, irgendwann, dieses Problem hat - hier meine Vorgehensweise (ist sicherlich nicht die schönste, aber es funktioniert wenigstens :D)

1. Boolean Parameter erstellen

ausblenden C#-Quelltext
1:
private volatile Boolean _noselection = true;					


2. im SelectionChanged Event der DataGridView Selektierungen aufheben (gleich zu Beginn)

ausblenden C#-Quelltext
1:
2:
3:
4:
if (_noselection)
            {
                dataGridView1.ClearSelection();
            }


3. Selektierungsverbot bei Mausklick aufgeben (MouseDown Event)

ausblenden C#-Quelltext
1:
_noselection = false;					


So hat es bei mir funktioniert. Da ich einen eigenen Filter geschrieben habe und nicht mit BindView arbeite (sonst wird nach jeder BindView Zuweisung die erste Reihe selektiert - dies konnte, zu mindestens bei mir, auch nicht mit einem ClearSelection() aufgehoben werden) habe ich die Daten selbständig nach persönlichen Vorgaben gefiltert.

Code zur Erstellung der Tabelle:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public void BuildTable()
        {

            _table = new DataTable();

            _table.Columns.Add(new DataColumn("Kategorie", Type.GetType("System.String")));
            _table.Columns.Add(new DataColumn("Bewilligt", Type.GetType("System.Boolean")));
            dataGridView1.DataSource = _table;
        }


Code zum Füllen der Tabelle:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
public void InitializeData()
        {
            var templiste = GetData();
            _table.Clear();

            foreach (string[] s in templiste)
            {
                if (CheckData(s))
                {
                    DataRow row = _table.NewRow();
                        row["Kategorie"] = s[0];
                        row["Bezeichnung"] = s[1] + " " + s[2];
                        row["Anzahl"] = s[3];
                        row["Beginn"] = s[4];
                        row["Ende"] = s[5];
                        row["Antragssteller"] = s[6];
                        row["Bewilligt"] = Convert.ToBoolean(s[7]);
                        _table.Rows.Add(row);
                }
            }
        }


Bei der CheckData() Funktion prüfe ich nur ob der Datensatz zur derzeitigen Formatierung passt. Die Rückgabe (true/false) bestimmt dann ob der Wert als Reihe aufgenommen wird. Bei jeder Filteränderung wird die Funktion aufgerufen (über die entsprechenden Events der entsprechenden Elemente)

Vielleicht kann ich ja damit jemanden weiterhelfen :D Ansonsten bin ich erstmal mit dem Ergebniss zufrieden. Danke aber für jede Hilfe ;)