【问题标题】:Editable DataGrid - CanUserAddRows="True" not working可编辑的 DataGrid - CanUserAddRows="True" 不起作用
【发布时间】:2014-03-11 15:34:41
【问题描述】:

我有以下数据网格:

 <DataGrid ItemsSource="{Binding EmployeeList}" CanUserAddRows="True" AutoGenerateColumns="False" Margin="0,0,0,90">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="CountryCombo2">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding Path=DataContext.CountryList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
                                      DisplayMemberPath="CountryName" 
                                      SelectedItem="{Binding EmployeeCountry, Mode=TwoWay}"
                                      SelectedValue="{Binding EmployeeCountry.CountryId}"
                                      SelectedValuePath="CountryId" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

但是,我无法向 DataGrid 添加新行。如果我需要提供任何其他代码,请告诉我。

更新:

屏幕 1:这是窗口刚加载硬编码属性值时的屏幕截图。现在我看到了空的新行。

屏幕 2:在这里,我已将数据添加到具有 Rambo 和 Russia 值的新行中。现在,无论我做什么(制表符,单击另一个单元格),都不会添加下一个新行。我相信它应该添加一个新行。

屏幕 3:此处新添加的行值已消失。那是因为我双击了两个空单元格之间的细边框。现在这很奇怪。

屏幕 4:现在,当我单击 Peter 单元格时,先前输入的行数据又回来了,但现在它被向下推,并在其前面插入了一个新的空行。这很奇怪。

谁能帮我理解 DataGrid 的这种行为?

【问题讨论】:

  • 可以肯定的是,您在 DataGrid 的底部看到了一个空行,对吗?应该发生的是,如果您在该行中输入内容,则新行将自动出现在 DataGrid 的底部。这是您期望但没有看到的行为吗?抱歉,这似乎是一个显而易见的问题,但有时人们的期望并不明显。
  • 是的@ouflak,这就是我所期待的行为。但我没有让新行自动出现在 DataGrid 的底部。
  • 您的 ItemsSource 的类型是什么?类型 T 必须有无参数构造函数。当我回到我的办公室时,我会尝试一下。
  • 我错过了无参数构造函数。感谢您指出这一点。尽管我在 DataGrid 中遇到了另一个奇怪的问题。请参考我的问题的更新部分。
  • 你更新了吗?没有看到它...可能刷新不起作用....

标签: wpf datagrid datagridtemplatecolumn


【解决方案1】:

就我而言,

首先确保您的ItemSource 没有使用无法向其中添加新项目的array

使用像List 这样可以添加新项目的东西,

此外,SomeClass 应该有一个 默认构造函数 不接受类似的参数

List<SomeClass>();

public Class SomeClass
{       
  public SomeClass() { }
}

然后新的空行出现在DataGrid的底部。

参考this的回答。

【讨论】:

    【解决方案2】:

    我将继续在此处发布此作为答案,因为我需要发布代码示例并且 cmet 开始变得扩展(收到聊天邀请消息)。

    原问题的答案是确保 ItemsSource 的 Type T 有一个无参数的构造函数。

    试试这个附加到DataGrid的BeginningEdit事件的代码来吞噬单元格边框的点击:

    private void Grid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        //// Have to do this in the unusual case where the border of the cell gets selected
        e.Cancel = true;
    }
    

    如果您实际上正在将此处理程序用于其他用途,或者打算这样做,您可以检查 OriginalSource 以查看它是否是 Border 并在这种情况下取​​消事件。

    【讨论】:

    • 这确实解决了问题,但只是部分解决了。我仍然无法再添加任何行。
    • 好了,现在你可以看到原来的空行了。你可以编辑它。但是有没有自动创建额外的行?对吗?
    • 有人能重现这个问题吗?还是我做错了什么?
    • 我已经复制了它,但我现在有点忙于一些事情,坦率地说,我有点不知道该怎么做。我有一些笨拙的想法,例如处理 Cell 的 Selected 事件并将新的“空白”项目添加到 ItemsSource 或类似的东西。但类似的东西真的只能用于测试。内置功能应该可以工作。 耸耸肩
    【解决方案3】:

    使用 DataGridTextColumn 和 DataGridComboBoxColumn 代替 DataGridTemplateColumn,然后行将被充分添加。

    如果要使用DataGridTemplateColumn,那么不仅要设置CellTemplate,还要设置CellEditingTemplate。例如:

    <DataGridTemplateColumn Header="Pick a Date">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding myDate}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <DatePicker SelectedDate="{Binding myDate}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多