none
wpf 动态生成到dataGrid的列如何添加click事件

    问题

  • //添加排期数据控件Grid
    DataGrid sessionsGrid = new DataGrid();

    DataGridTemplateColumn templateColumn = new DataGridTemplateColumn();
                        templateColumn.Header = "选座购票";
                        //定义长度
                        DataGridLength templatelength = new DataGridLength(2, DataGridLengthUnitType.Star);
                        templateColumn.Width = templatelength;
                        //内容
                        string buttonxaml = @"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
                                    <Button Name='button' VerticalAlignment='Center' HorizontalAlignment='Center' Margin='0,0,0,0'
                                         Style = '{DynamicResource MyButton}' Click='myButton_Click'>
                                    <Button.Content>
                                    <StackPanel Orientation='Horizontal'>
                                        <TextBlock Text='点击购票'/></StackPanel>
                                    </Button.Content>
                                    </Button>
                                </DataTemplate>";
                        DataTemplate buttonDataTemplate = XamlReader.Parse(buttonxaml) as DataTemplate;

    templateColumn.CellTemplate = buttonDataTemplate;
                        sessionsGrid.Columns.Add(templateColumn);
                        sessionsGrid.ItemsSource = FilmSessionGroup;

    动态生成的datagrid,添加了一个模板列,上面有一个按钮,请问如何让这个按钮起作用

    private void myButton_Click(object sender, EventArgs e)
            {
                MessageBox.Show("ssss");
            }


    现在的错误提示是: 其他信息: 无法从文本“myButton_Click”创建“Click”。

    2017年3月16日 3:33

答案


  • Hi  jianming2032

    >>动态生成的datagrid,添加了一个模板列,上面有一个按钮,请问如何让这个按钮起作用

    你需要在xml动态创建button之后,动态赋予它点击事件处理逻辑。

        public void createbutton()
            {
                StringReader sr = new StringReader(@"<Button xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
            Foreground='BurlyWood' FontSize='20pt'>Click Me!</Button>");
    
                XmlReader reader = XmlReader.Create(sr);
    
                Button dynamicButton = (Button)XamlReader.Load(reader);
    
                this.grid.Children.Add(dynamicButton);
    
                dynamicButton.Click += button1_Click;
    
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Dynamic Button Loaded From XAML String");
            }
    
    


            
    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 lctk 2017年3月17日 0:24
    • 已标记为答案 jianming2032 2018年3月3日 4:05
    2017年3月16日 9:10
  • 你好,请问你的问题解决了吗? 我也遇到了相同的问题,目前没有找到解决方案
    你好,我已经把DataGrid移到了页面上,采用数据绑定的方式了
    <DataGridTemplateColumn Header="选座购票" Width="2*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button Content="选座购票" Style="{DynamicResource SelectSeatButton}" Command="{Binding Path=DataContext.SelectSeatCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"></Button>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
    2018年3月3日 3:16

全部回复


  • Hi  jianming2032

    >>动态生成的datagrid,添加了一个模板列,上面有一个按钮,请问如何让这个按钮起作用

    你需要在xml动态创建button之后,动态赋予它点击事件处理逻辑。

        public void createbutton()
            {
                StringReader sr = new StringReader(@"<Button xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
            Foreground='BurlyWood' FontSize='20pt'>Click Me!</Button>");
    
                XmlReader reader = XmlReader.Create(sr);
    
                Button dynamicButton = (Button)XamlReader.Load(reader);
    
                this.grid.Children.Add(dynamicButton);
    
                dynamicButton.Click += button1_Click;
    
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("Dynamic Button Loaded From XAML String");
            }
    
    


            
    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 lctk 2017年3月17日 0:24
    • 已标记为答案 jianming2032 2018年3月3日 4:05
    2017年3月16日 9:10
  • 谢谢Yohann Lu,但是这种是一个按钮的情况,如果我想把它放到DataGridTemplateColumn中要如何实现?,因为我每一行都需要一个按钮来操作.
    2017年3月17日 2:33
  • Hi  jianming2032


    >>,如果我想把它放到DataGridTemplateColumn中要如何实现?,因为我每一行都需要一个按钮来操作.

    我建议你在 DataGridTemplateColumn XAML模板里面定义好它。

           
            <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <!--换成你的button-->
                                <CheckBox x:Name="chkName" IsChecked="{Binding IsChecked ,  UpdateSourceTrigger=PropertyChanged}" Click="chkName_Click">
                                </CheckBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

     
    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月17日 5:11
  • 非常感谢您的答复,因为我这个DataGridTemplateColumn在.cs文件里面生成的,所以需要以文本的方式添加,像这样

    string buttonxaml = @"<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
                                    <Button Name='button' VerticalAlignment='Center' HorizontalAlignment='Center' Margin='0,0,0,0'
                                         Style = '{DynamicResource MyButton}' Click='myButton_Click'>
                                    <Button.Content>
                                    <StackPanel Orientation='Horizontal'>
                                        <TextBlock Text='点击购票'/></StackPanel>
                                    </Button.Content>
                                    </Button>
                                </DataTemplate>";
                        DataTemplate buttonDataTemplate = XamlReader.Parse(buttonxaml) as DataTemplate;

    所以就回到了刚开始的问题 : 无法从文本“myButton_Click”创建“Click”。

    如果用Button b=new Button();

    那么我这个button要怎么添加到buttonDataTemplate?
    如果能够添加到buttonDataTemplate,那么再调用 templateColumn.CellTemplate = buttonDataTemplate;

    那么就成功了

    2017年3月18日 6:19
  • 你好,请问你的问题解决了吗? 我也遇到了相同的问题,目前没有找到解决方案
    2018年2月28日 8:25
  • 你好,请问你的问题解决了吗? 我也遇到了相同的问题,目前没有找到解决方案
    你好,我已经把DataGrid移到了页面上,采用数据绑定的方式了
    <DataGridTemplateColumn Header="选座购票" Width="2*">
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button Content="选座购票" Style="{DynamicResource SelectSeatButton}" Command="{Binding Path=DataContext.SelectSeatCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"></Button>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
    2018年3月3日 3:16