1

当窗口加载到我的 C# 桌面应用程序中时,我想Checkbox在控件中动态添加一些内容。Grid复选框将出现多少次取决于表中的条目数。在这里,我使用LINQ To SQL了类。Grid 控件在 XAML 中定义。

...
<Grid Name="grid1">
   <!-- here i would like to show all check box -->
</Grid>
...

文件后面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
// class declaration ...
...
private void course_Loaded(object sender, RoutedEventArgs e)
    {
        List<Course> courses = ldc.Courses.ToList();
        foreach (var c in courses)
        {
            CheckBox cb = new CheckBox();
            cb.Name=c.CourseID.ToString();
            cb.Content = c.CourseID.ToString();
            //grid1.Controls.Add(cb); does not work. what to do here?
        }
    }

此代码不起作用。有什么建议吗?谢谢你。

4

2 回答 2

3

我建议将这些 CheckBoxes 添加到 StackPanel,然后将 StackPanel 添加到网格中:

StackPanel innerStack;

private void course_Loaded(object sender, RoutedEventArgs e)
{
    innerStack= new StackPanel 
    {
        Orientation=Orientation.Vertical
    };
    List<Course> courses = ldc.Courses.ToList();

    foreach (var c in courses)
    {
        CheckBox cb = new CheckBox();
        cb.Name = c.CourseID.ToString();
        cb.Content = c.CourseID.ToString();
        innerStack.Children.Add(cb);
    }
    Grid.SetColumn(innerStack,  /*Set the column of your stackPanel, default is 0*/);
    Grid.SetRow(innerStack,  /*Set the row of your stackPanel, default is 0*/);
    Grid.SetColumnSpan(innerStack,  /*Set the columnSpan of your stackPanel, default is 1*/);
    Grid.SetRowSpan(innerStack,  /*Set the rowSpan of your stackPanel, default is 1*/);

    Grid.Children.Add(innerStack);
}

如果您不想要这种结构,您应该在网格中添加一些 RowDefinition 并使用 Grid.SetRow(cb, int) 方法将 ComboBoxes 相互叠加。

于 2012-12-20T04:29:52.573 回答
1

你这样做是错的。

先说可以做grid1.Children.Add(cb);

那么真正的问题是您正在使用网格来显示列表。在 WPF 中有一个非常好的 ListView,它具有完全可样式化的行,可以包括复选框和几乎所有你能想象到的东西。

我不知道您的数据是什么样的,所以我无法在 ListView 上进行太多扩展,但类似于

<ListView ItemsSource="{Binding Courses}">
     <ListView.View>
           <GridView>
                <GridViewColumn Width="120">
                      <GridViewColumnHeader>
                            <TextBlock Text="Course Name"/>
                      </GridViewColumnHeader>
                      <GridViewColumn.CellTemplate>
                           <DataTemplate>
                                <TextBlock Text="{Binding ...UFigureThisOut}"/>
                           </DataTemplate>
                      </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Width="120">
                      <GridViewColumnHeader>
                            <TextBlock Text="Take That"/>
                      </GridViewColumnHeader>
                      <GridViewColumn.CellTemplate>
                           <DataTemplate>
                                <CheckBox IsChecked="{Binding ...UFigureThisOutToo}"/>
                           </DataTemplate>
                      </GridViewColumn.CellTemplate>
                </GridViewColumn> 
           </GridView> 
     </ListView.View>
</ListView>
于 2012-12-19T21:29:07.710 回答