Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
neues Tab im TabControl aktivieren
MorphieX
myCSharp.de - Member



Dabei seit:
Beiträge: 184
Herkunft: Rahden

Themenstarter:

neues Tab im TabControl aktivieren

beantworten | zitieren | melden

Hi,

ich habe ein TabControl mit einem Tab, auf dem sich ein DataGrid befindet.
Jetzt möchte ich über ein RelayCommand-Objekt ein neues Tab zur Laufzeit erzeugen.
Dieses Tab soll dann auch automatisch als SelectedItem aktiviert werden.

Das RelayCommand-Objekt führt folgenden Code aus


private void Add()
{
    PartnerDetailsTabItem tab = new PartnerDetailsTabItem();
    TabControl1.Items.Add(tab);
    TabControl1.SelectedItem = tab;
}

Binde ich das RelayCommand z.B. an einen Button klappt das wunderbar. Das neue Tab erscheint im TabControl und wird sofort aktiviert.

Jetzt möchte ich aber die gleiche Funktionalität haben, wenn ich einen Doppelklick auf das DataGrid mache.

Weil es dafür ja keine entsprechende Command-Eigenschaft gibt, habe ich das erstmal über das Ereignis "MouseDoubleClick" vom DataGrid in der CodeBehind-Datei gemacht:


private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    Add();
}

Dabei wird das TabItem dem TabControl hinzugefügt, aber nicht aktiviert?!

Weiß jemand, woran das liegen könnte und wie ich diesen Effekt umgehen kann?
private Nachricht | Beiträge des Benutzers
MatthiasDietschweiler
myCSharp.de - Member



Dabei seit:
Beiträge: 7

beantworten | zitieren | melden

Dein Focus liegt während dem Event auf dem Grid. Ev. musst du zuerst das TabContdrol fokusieren und erst dann das selectedItem zuweisen.
private Nachricht | Beiträge des Benutzers
MorphieX
myCSharp.de - Member



Dabei seit:
Beiträge: 184
Herkunft: Rahden

Themenstarter:

beantworten | zitieren | melden

Leider brachte das keine Besserung... :-(
Habe es in zig verschiedenen Kombinationen ausprobiert...

Selbst das funktioniert nicht:
1. Tab entfernen
2. Tab Hinzufügen
2. Tab aktivieren (bis hier hin klappts)
1. Tab wieder hinzufügen

Anschließend ist der 1. Tab wieder aktiv?! selbst wenn ich nach jeder Zeile den Fokus auf das TabControl oder direkt auf Tab2 setze bleibt anschließend der 1. Tab immer aktiv...

Hat jemand noch ne Idee?
private Nachricht | Beiträge des Benutzers
Nava
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

Hallo,

Mein Tip ist das

TabControl1.SelectedItem = tab;
ins Leere läuft. Weil deine Klasse "PartnerDetailsTabItem" die Methode "Equals" nicht überschrieben hat. Kurz gesagt er findet keine passendes Tab.

Alternativ könntest du auch folgendes machen:

tabControl1.SelectedIndex = tabControl1.Items.Count -1 ;

Viele Grüße,
Nava
private Nachricht | Beiträge des Benutzers
MorphieX
myCSharp.de - Member



Dabei seit:
Beiträge: 184
Herkunft: Rahden

Themenstarter:

beantworten | zitieren | melden

Leider auch nicht... Habe ich auch schon probiert...

Ich konnte nun feststellen, dass das ganze nur bei "CollectionControls" (?) auftritt... Also Controls, die Collections halten können (DataGrid, ListBox,...)
Nehme ich stattdessen einen Button oder eine CheckBox oder anderes Control, klappt es wunderbar... Ich brauche aber ein DataGrid...
private Nachricht | Beiträge des Benutzers
Nava
myCSharp.de - Member



Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

Hi,

Ich kann deinen Fehler nicht nachvollziehen.
Ich habe es grade getestet und es funktioniert.

private void button1_Click(object sender, RoutedEventArgs e)
        {
            DataGrid  tab = new DataGrid();
            tabControl1.Items.Add(tab);
            tabControl1.SelectedIndex = tabControl1.Items.Count -1 ;
        }


Kannst du bitte den Quelltext der Classe "PartnerDetailsTabItem" posten.
private Nachricht | Beiträge des Benutzers
MorphieX
myCSharp.de - Member



Dabei seit:
Beiträge: 184
Herkunft: Rahden

Themenstarter:

beantworten | zitieren | melden

Ich glaube da hast du mich falsch verstanden...

1. möchte ich kein DataGrid als Tab einfügen, sondern von einem DataGrid aus ein neues TabItem hinzufügen.
2. funktioniert das ganze über einen Button reibungslos. Nur von "CollectionControls" wie z.B. dem DataGrid aus nicht. Dort will ich das Ereignis "MouseDoubleClick" nutzen, um ein neues TabItem an das TabControl anzuhängen.

Ich habe mal ein minimales Beispielprojekt angehängt, bei dem man die Problematik sehen sollte...
Attachments
private Nachricht | Beiträge des Benutzers
Gwinn
myCSharp.de - Member



Dabei seit:
Beiträge: 48

beantworten | zitieren | melden

Hi MorphieX,

spendier deinem EventHandler noch ein

e.Handled=true;
Dann sollte es auch klappen.


private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
     AddTabItem();
     e.Handled = true;
}

Gruß Gwinn
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Gwinn am .
private Nachricht | Beiträge des Benutzers
MorphieX
myCSharp.de - Member



Dabei seit:
Beiträge: 184
Herkunft: Rahden

Themenstarter:

beantworten | zitieren | melden

So klappts... ;-)

So klug wie ich war, habe ich mein Problem aufs "wichtigste" beschränkt...
Mit einem normalen DataGrid klappts also...

Ich verwende in wirklichkeit aber das GridControl von DevExpress. Hier habe ich ein Event

tableView1_RowDoubleClick(object sender, DevExpress.Xpf.Grid.RowDoubleClickEventArgs e)

e.handled = true;
habe ich schon ausprobiert und es hat bei dem Grid nicht funktioniert.
Daher dachte ich, dass das keine Lösung ist. Beim normalen DataGrid habe ich das deshalb auch nicht mehr weiter verfolgt...

Mein bisheriger Code:

private void tableView1_RowDoubleClick(object sender, DevExpress.Xpf.Grid.RowDoubleClickEventArgs e)
{
    Add();
    e.Handled = true;
}

Damit klappt es nicht...
Ich habe es jetzt aber trotzdem geschafft...

Für alle, die das gleiche Problem haben:
Man muss im Event tableView1_MouseDoubleClick das e.Handled auf true setzen, nicht im tableView1_RowDoubleClick.

Also so:

private void tableView1_RowDoubleClick(object sender, DevExpress.Xpf.Grid.RowDoubleClickEventArgs e)
{
    Add();
}

private void tableView1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

Ich danke allen, die mir bei dem Problem geholfen haben! ;) Nächstes Mal stelle ich die Frage direkt konkreter... :-)
private Nachricht | Beiträge des Benutzers