简体   繁体   中英

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.

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)
{
 }

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, eg

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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM