有多种方法可以获得所需的结果,但这是我能想到的第一个解决方案。为了找到适合您情况的最佳解决方案,我需要更多地了解确切的要求。
根据您提供的当前信息,这是我能想到的最好的:
首先,您需要实现 GridView 的 OnAutoGeneratingColumn 事件。
<telerik:RadGridView x:Name="MyGridView" AutoGenerateColumns="True" AutoGeneratingColumn="MyGridView_OnAutoGeneratingColumn" ItemsSource="{Binding MyData}" />
在这种情况下,您可以自定义生成的列。例如,您可以避免生成某些列或自定义您真正想要的任何内容。在您的情况下,您当然希望将CheckBox 添加到Header。
private void MyGridView_OnAutoGeneratingColumn(object sender, GridViewAutoGeneratingColumnEventArgs e)
{
//Extra1: Ignore this event for certain columns
if (e.Column.UniqueName.Contains("extra1"))
{
return;
}
//Extra2: Disable the generation of a column entirely
if (e.Column.UniqueName.Equals("extra2"))
{
e.Cancel = true;
return;
}
//Place a CheckBox inside the header
e.Column.Header = new StackPanel()
{
Orientation = Orientation.Vertical,
Children =
{
new TextBlock()
{
Text = e.Column.UniqueName,
Margin = new Thickness(2),
HorizontalAlignment = HorizontalAlignment.Center
},
new CheckBox()
{
Margin = new Thickness(2),
HorizontalAlignment = HorizontalAlignment.Center
}
}
};
}
现在应该会为您提供所需的结果,如屏幕截图所示。
第二部分是获取选中列的列表。对于这一部分,我真的不知道你到底在寻找什么,但我会给你一些东西让你开始。
考虑以下是按钮的OnClick 事件:
private void MyButton_OnClick(object sender, RoutedEventArgs e)
{
var cols = new List<GridViewColumn>();
foreach (var col in MyGridView.Columns)
{
var hc = MyGridView.ChildrenOfType<GridViewHeaderCell>().FirstOrDefault(q => q.Column != null && q.Column.UniqueName == col.UniqueName && q.Column.DisplayIndex == col.DisplayIndex);
if (hc == null) continue;
var cb = hc.FindChildByType<CheckBox>();
if (cb != null && cb.IsChecked == true)
cols.Add(col);
}
MessageBox.Show(string.Join(", ", cols.Select(q => q.UniqueName)));
}
如果您还有其他问题或需要更多帮助,请发表评论。
更新:我使用的是 Telerik 的 WPF 版本,这就是我使用 telerik:RadGridView 的原因。我没有意识到您使用的是 ASP.NET AJAX 版本,它使您的成为telerik:RadGrid。
我相信我的OnAutoGeneratingColumn 事件在您的版本中相当于OnColumnCreated here is the documentation of telerik
如果这解决了您的问题,如果您能将其标记为答案,我也将不胜感激,或者如果这对您有任何帮助,至少给它一个赞成票。