仅将一个 DataGrid 行设置为可编程编辑
Set only one DataGrid Row to be editable programmatically
我正在用数据库中的信息填充我的 DataGrid。信息显示正常。我想将所有内容都保留为只读少一栏。我不希望该列 header 是可编辑的。只有它下面的行。例如,根据下图,我希望能够编辑列参与者行内容 5、5、5 和 3。
我没有看到任何选项可以单独 select 将行或列设置为只读。我只看到将整个 DataGrid 设置为只读的选项。我试图遍历并尝试将只读设置为所需的列但不能。请指教。谢谢。
看到一些示例,您可以通过 XAML 单独声明哪一列是只读的,但这些是 pre-determined 数据的手动输入。我正在尝试使用自动生成的列来填充 DataGrid,并且数据来自数据库,我想以编程方式进行。
Connection connection = new Connection();
public static DataTable dt = new DataTable();
private void FillTable(DataGrid dataGrid)
{
//Connecting to database
connection.ConnectToDB(table, dt);
dataGrid.ItemsSource = dt.DefaultView;
foreach (DataGridColumn column in dataGrid1.Columns)
{
if (column.DisplayIndex == 1)
{
dataGrid1.IsReadOnly = true;
}
}
//dataGrid1.IsReadOnly = true;
}
XAML:
<DataGrid x:Name="dataGrid1" Canvas.Left="10" Canvas.Top="10" Height="auto" Width="auto" MaxHeight="400" AutoGenerateColumns="True" Style="{DynamicResource DataGridStyle1}"/>
将 AutoGenerateColumns
-属性 设置为 false,这样您就可以在您想要的视觉设计中提供您想要的属性。
带蒙皮的小例子:
<GroupBox Grid.Row="2" Header="Items" Padding="5">
<GroupBox.Resources>
<Style TargetType="{x:Type DataGrid}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#C2E58F" />
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#C2E58F" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="BorderThickness" Value="0" />
</Trigger>
</Style.Triggers>
</Style>
</Style.Resources>
<Setter Property="BorderThickness" Value="0" />
<Setter Property="AutoGenerateColumns" Value="False" />
<Setter Property="AlternationCount" Value="2" />
<Setter Property="AlternatingRowBackground" Value="LightGray" />
<Setter Property="CanUserAddRows" Value="False" />
<Setter Property="CanUserDeleteRows" Value="False" />
<Setter Property="SelectionMode" Value="Single" />
<Setter Property="SelectionUnit" Value="FullRow" />
<Setter Property="FocusManager.IsFocusScope" Value="True" />
</Style>
</GroupBox.Resources>
<DataGrid ItemsSource="{Binding NameNotes, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Firstname" Width="Auto" SortMemberPath="Firstname">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Firstname}" VerticalAlignment="Center" Margin="3,1"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Firstname}" VerticalAlignment="Center" Margin="3,1"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Lastname" Width="Auto" SortMemberPath="Lastname">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Lastname}" VerticalAlignment="Center" Margin="3,1"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Note" Width="*" SortMemberPath="Note">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Note}" VerticalAlignment="Center" Margin="3,1" TextWrapping="WrapWithOverflow"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</GroupBox>
要编辑一列,您必须为此列提供 CellEditingTemplate
。在我的示例中,我已经为 Firstname-Column 完成了此操作。
如果列是自动生成的,则处理 DataGrid.AutoGeneratingColumn
。
private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName != "Participants")
{ e.Column.IsReadOnly = true; }
}
并更改FillTable
方法:
private void FillTable(DataGrid dataGrid)
{
connection.ConnectToDB(table, dt);
dataGrid.ItemsSource = dt.DefaultView;
}
我正在用数据库中的信息填充我的 DataGrid。信息显示正常。我想将所有内容都保留为只读少一栏。我不希望该列 header 是可编辑的。只有它下面的行。例如,根据下图,我希望能够编辑列参与者行内容 5、5、5 和 3。
我没有看到任何选项可以单独 select 将行或列设置为只读。我只看到将整个 DataGrid 设置为只读的选项。我试图遍历并尝试将只读设置为所需的列但不能。请指教。谢谢。
看到一些示例,您可以通过 XAML 单独声明哪一列是只读的,但这些是 pre-determined 数据的手动输入。我正在尝试使用自动生成的列来填充 DataGrid,并且数据来自数据库,我想以编程方式进行。
Connection connection = new Connection();
public static DataTable dt = new DataTable();
private void FillTable(DataGrid dataGrid)
{
//Connecting to database
connection.ConnectToDB(table, dt);
dataGrid.ItemsSource = dt.DefaultView;
foreach (DataGridColumn column in dataGrid1.Columns)
{
if (column.DisplayIndex == 1)
{
dataGrid1.IsReadOnly = true;
}
}
//dataGrid1.IsReadOnly = true;
}
XAML:
<DataGrid x:Name="dataGrid1" Canvas.Left="10" Canvas.Top="10" Height="auto" Width="auto" MaxHeight="400" AutoGenerateColumns="True" Style="{DynamicResource DataGridStyle1}"/>
将 AutoGenerateColumns
-属性 设置为 false,这样您就可以在您想要的视觉设计中提供您想要的属性。
带蒙皮的小例子:
<GroupBox Grid.Row="2" Header="Items" Padding="5">
<GroupBox.Resources>
<Style TargetType="{x:Type DataGrid}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#C2E58F" />
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#C2E58F" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="BorderThickness" Value="0" />
</Trigger>
</Style.Triggers>
</Style>
</Style.Resources>
<Setter Property="BorderThickness" Value="0" />
<Setter Property="AutoGenerateColumns" Value="False" />
<Setter Property="AlternationCount" Value="2" />
<Setter Property="AlternatingRowBackground" Value="LightGray" />
<Setter Property="CanUserAddRows" Value="False" />
<Setter Property="CanUserDeleteRows" Value="False" />
<Setter Property="SelectionMode" Value="Single" />
<Setter Property="SelectionUnit" Value="FullRow" />
<Setter Property="FocusManager.IsFocusScope" Value="True" />
</Style>
</GroupBox.Resources>
<DataGrid ItemsSource="{Binding NameNotes, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Firstname" Width="Auto" SortMemberPath="Firstname">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Firstname}" VerticalAlignment="Center" Margin="3,1"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Firstname}" VerticalAlignment="Center" Margin="3,1"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Lastname" Width="Auto" SortMemberPath="Lastname">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Lastname}" VerticalAlignment="Center" Margin="3,1"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Note" Width="*" SortMemberPath="Note">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Note}" VerticalAlignment="Center" Margin="3,1" TextWrapping="WrapWithOverflow"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</GroupBox>
要编辑一列,您必须为此列提供 CellEditingTemplate
。在我的示例中,我已经为 Firstname-Column 完成了此操作。
如果列是自动生成的,则处理 DataGrid.AutoGeneratingColumn
。
private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName != "Participants")
{ e.Column.IsReadOnly = true; }
}
并更改FillTable
方法:
private void FillTable(DataGrid dataGrid)
{
connection.ConnectToDB(table, dt);
dataGrid.ItemsSource = dt.DefaultView;
}