【问题标题】:Set only one DataGrid Row to be editable programmatically仅将一个 DataGrid Row 设置为以编程方式可编辑
【发布时间】:2015-03-09 11:51:04
【问题描述】:

我正在用来自数据库的信息填充我的 DataGrid。信息显示正常。我想将所有内容都保留为只读少一列。我不希望该列标题可编辑。只有它下面的行。例如,根据下图,我希望能够编辑列 Participants 行内容 5、5、5 和 3。

我没有看到任何可以单独选择行或列设置为只读的选项。我只看到一个将整个 DataGrid 设置为只读的选项。我试图循环并尝试将只读设置为所需的列,但不能。请指教。谢谢。

看到了一些示例,您可以通过 XAML 单独声明哪一列是只读的,但这些是预先确定的数据的手动输入。我正在尝试使用自动生成的列填充 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}"/>

【问题讨论】:

  • 列是自动生成的吗?

标签: c# wpf xaml datagrid


【解决方案1】:

如果列是自动生成的,则处理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;
}

【讨论】:

  • 试过你的方法。每列最终都是可编辑的,当我尝试编辑 Participants 行内容并按 Enter 时,屏幕冻结。
  • 编辑并添加了我的 XAML 行,如果有帮助的话。
  • 从您的代码中删除 dataGrid1.IsReadOnly = true;
  • 是的,我正在将您的代码与您展示的经过编辑的 FillTable 方法一起使用。
  • 小幅修正。屏幕冻结是我的错。我输入了错误的值。错误是 - 我可以编辑所有内容,而不仅仅是参与者列。
【解决方案2】:

AutoGenerateColumns-Property 设置为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 完成此操作。

【讨论】:

  • 谢谢,但我试图从我的类文件编程盟友中做到这一点,最好不要使用 XAML。
猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2014-10-18
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多