Laden...

neues Tab im TabControl aktivieren

Erstellt von MorphieX vor 11 Jahren Letzter Beitrag vor 11 Jahren 4.845 Views
M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 11 Jahren
neues Tab im TabControl aktivieren

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?

M
7 Beiträge seit 2012
vor 11 Jahren

Dein Focus liegt während dem Event auf dem Grid. Ev. musst du zuerst das TabContdrol fokusieren und erst dann das selectedItem zuweisen.

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 11 Jahren

Leider brachte das keine Besserung... 😦
Habe es in zig verschiedenen Kombinationen ausprobiert...

Selbst das funktioniert nicht:

  1. Tab entfernen
  2. Tab Hinzufügen
  3. Tab aktivieren (bis hier hin klappts)
  4. 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?

N
29 Beiträge seit 2009
vor 11 Jahren

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

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 11 Jahren

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

N
29 Beiträge seit 2009
vor 11 Jahren

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.

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 11 Jahren

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

G
47 Beiträge seit 2011
vor 11 Jahren

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

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 11 Jahren

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