none
Welcher Button in welcher Zeile wurde in einem DataGridTemplateColumn angeklickt? RRS feed

  • Frage

  • Hallo

    Ich habe ein DataGrid-Control mit einer DataGridTemplateColumn, die folgendermaßen ausschaut:
    <WpfToolkit:DataGridTemplateColumn Header="Extendet Infos" Width=".9*">
                <WpfToolkit:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                         <Button Name="Button1" Width="30"  Click="Button_Click">
                                <Image Source="icon_doc.gif"/>
                            </Button>
                    </DataTemplate>
                </WpfToolkit:DataGridTemplateColumn.CellTemplate>
            </WpfToolkit:DataGridTemplateColumn>

    Ich habe also eine DataGridTemplateColumn die in jeder Zeile einen Button darstellt. Wenn ich jetzt auf einen dieser Buttons klicke, möchte ich gerne wissen, welcher Button aus welcher Zeile das war. Mit dem Button_Click-Event funktioniert das nicht, weil ich ja nur Informationen über den Button selbst erhalte, nicht jedoch zu welcher Zeile dieser Button gehört.
    Wie kann ich das also herausfinden?
    Samstag, 12. September 2009 14:43

Antworten

  • Hallo,

    das hängt davon ab, woran das DataGrid gebunden ist.

    Im einfachsten Falle kannst Du z. B. die Tag Eigenschaft nutzen, um dort ein Binding einzufügen,
    das auf einen eindeutigen Wert, wie den Primärschlüssel einer Tabelle zeigt:

    	<Button Name="Button1" Width="30" Click="Button_Click"
    		Tag="{Binding Path=OrderID}">
    		<Image Source="icon_doc.gif"/>
    	</Button>
    

    Und die Tag Eigenschaft kannst Du im Click-Handler auswerten.

    Eine aufwändigere Lösung wäre:
    http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

    Gruß Elmar
    Sonntag, 13. September 2009 10:15
  • Hallo Leute,

    habe leider eure Beiträge erst jetzt gesehn, weil die Notifications im Spamverdacht-Ordner gelandet sind.

    Erstmal danke für deine Hilfe und Antwort Elmar. So wärs auch gegangen, gute Idee. Meine Lösung wäre folgende:

     private void Button_AdditionalInfos(object sender, RoutedEventArgs e)
            {
    
                DependencyObject dep = (DependencyObject)e.OriginalSource;
    
                // iteratively traverse the visual tree
                while ((dep != null) &&
                        !(dep is DataGridCell) &&
                        !(dep is DataGridColumnHeader))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }
    
                if (dep == null)
                    return;
    
                if (dep is DataGridCell)
                {
                    DataGridCell cell = dep as DataGridCell;
                    while ((dep != null) && !(dep is DataGridRow))
                    {
                        dep = VisualTreeHelper.GetParent(dep);
                    }
     
                    DataGridRow row = dep as DataGridRow;
                    DataRowView view = row.Item as DataRowView;
                    Console.WriteLine(view.Row.ItemArray[0]);
    
    }
    }
    Ich gehe sozusagen den Baum solange nach oben, bis ich bei der DataGridCell bin und hole mit dann mittels

    view.Row.ItemArray[0]
    einen eindeutigen Wert.

    Nochmals danke für die Hilfe.


    Montag, 21. September 2009 21:17

Alle Antworten

  • Hallo,

    das hängt davon ab, woran das DataGrid gebunden ist.

    Im einfachsten Falle kannst Du z. B. die Tag Eigenschaft nutzen, um dort ein Binding einzufügen,
    das auf einen eindeutigen Wert, wie den Primärschlüssel einer Tabelle zeigt:

    	<Button Name="Button1" Width="30" Click="Button_Click"
    		Tag="{Binding Path=OrderID}">
    		<Image Source="icon_doc.gif"/>
    	</Button>
    

    Und die Tag Eigenschaft kannst Du im Click-Handler auswerten.

    Eine aufwändigere Lösung wäre:
    http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

    Gruß Elmar
    Sonntag, 13. September 2009 10:15
  • Hallo nightrider,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Samstag, 19. September 2009 19:29
    Moderator
  • Hallo Leute,

    habe leider eure Beiträge erst jetzt gesehn, weil die Notifications im Spamverdacht-Ordner gelandet sind.

    Erstmal danke für deine Hilfe und Antwort Elmar. So wärs auch gegangen, gute Idee. Meine Lösung wäre folgende:

     private void Button_AdditionalInfos(object sender, RoutedEventArgs e)
            {
    
                DependencyObject dep = (DependencyObject)e.OriginalSource;
    
                // iteratively traverse the visual tree
                while ((dep != null) &&
                        !(dep is DataGridCell) &&
                        !(dep is DataGridColumnHeader))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }
    
                if (dep == null)
                    return;
    
                if (dep is DataGridCell)
                {
                    DataGridCell cell = dep as DataGridCell;
                    while ((dep != null) && !(dep is DataGridRow))
                    {
                        dep = VisualTreeHelper.GetParent(dep);
                    }
     
                    DataGridRow row = dep as DataGridRow;
                    DataRowView view = row.Item as DataRowView;
                    Console.WriteLine(view.Row.ItemArray[0]);
    
    }
    }
    Ich gehe sozusagen den Baum solange nach oben, bis ich bei der DataGridCell bin und hole mit dann mittels

    view.Row.ItemArray[0]
    einen eindeutigen Wert.

    Nochmals danke für die Hilfe.


    Montag, 21. September 2009 21:17