TirednBored
TirednBored

Reputation: 67

How to add multiple new buttons from template in a UI from C# and call on click event for a particular buttons

I am reading a database file and based on the no. of entries output from the database to my query, I want to populate the buttons. And on clicking any of these buttons, I want to call an on click event for that entry in the database. How can I do that?

Template for Button:

<Window.Resources>
    <ControlTemplate TargetType="Button" x:Key="RoundBtn">
        <Border Name="roundBorder" CornerRadius="12.5" Height="25" Width="95" Margin="0" BorderBrush="Green" BorderThickness="0,0,0,0"
            Background="Green">
            <TextBlock Text="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="12,0,13,0" Foreground="White"
            />
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="false">
                <Setter TargetName="roundBorder" Property="Background" Value="Gray" />
                <Setter TargetName="roundBorder" Property="BorderBrush" Value="Gray" />
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Resources>

I need help in creating buttons and creating the on click event for calling it. I can handle the logic inside the on click event, but the problem is to identify which button was clicked on, so as to pass data for that particular button.

Upvotes: 0

Views: 661

Answers (2)

ASh
ASh

Reputation: 35720

The task of generating multiple controls for multiple items from some list is best solved using ItemsControl:

<ItemsControl Name="itemsList">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="local:DataEntity">
            <Button Template="{StaticResource RoundBtn}" 
                    Content="{Binding Name}"
                    Click="ItemButtonClick"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

This ItemsControl named "itemsList" contains buttons with custom template. Each button will display one the Name of one item from list.

DataEntity is a class which contains values from db, e.g.

public class DataEntity
{
    public string Name { get; set; }
}

Items list is linked to ItemsControl via ItemsSource property (in my demo I'm doing it in window code-behind in constructor)

itemsList.ItemsSource = new ObservableCollection<DataEntity>
{
    new DataEntity { Name = "A" },
    new DataEntity { Name = "B" },
    new DataEntity { Name = "C" },
};

Buttons have click handler attached ("ItemButtonClick"). The clicked button is determined from sender argument:

private void ItemButtonClick(object sender, RoutedEventArgs e)
{
    var button = (Button)sender;
    var item = button.DataContext as DataEntity;

    MessageBox.Show("Clicked " + item.Name);
}

Upvotes: 1

Aousaf Rashid
Aousaf Rashid

Reputation: 5758

Rather than creating a ControlTemplate,just create a Style.Then the code would be like :

 Button btn = new Button
 btn.Style= (Style)FindResource("RoundBtn")
 grid.Children.Add(btn);
 btn.click += new EventHandler(btn_click);

 private void btn_Click(object sender, RoutedEventArgs e)
{
 }

Upvotes: 1

Related Questions