【问题标题】:WPF Datagrid copy last row of grid to new row in grid (Devexpress)WPF Datagrid 将网格的最后一行复制到网格中的新行(Devexpress)
【发布时间】:2018-02-12 11:13:57
【问题描述】:

有些事情我想做,但我把它当作一个假人。这是步骤;

  1. 当用户点击 Datagrid 上的 ctrl + D 按钮时
  2. datagrid 值的最后一行 将复制到 clippopard 或某处(例如,CopyToClipboard func。)
  3. 从剪贴板或其他东西到再次它可能是一个函数,例如pastToclipboard 或者我们可以使用 InitNewRowEventArgs 它使我们能够访问 RowHandle 功能

这是我目前完成的代码。

private void dtg_tabletrial_KeyDown(object sender, KeyEventArgs e)
 {
  if (e.Key == Key.D && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
        {  
          MessageBox.Show("You hit ctrl + D");
        }
 }

 private void dtg_view_InitNewRow(object sender, DevExpress.Xpf.Grid.InitNewRowEventArgs e)
    {
        dtg_tabletrial.SetCellValue(e.RowHandle, "UserName", "emre");
        dtg_tabletrial.SetCellValue(e.RowHandle, "Surname", "newcompany");
        dtg_tabletrial.SetCellValue(e.RowHandle, "Address", "new addres");
        dtg_tabletrial.SetCellValue(e.RowHandle, "Phone", "new phone");   
    }

【问题讨论】:

  • “最后一行”是指:源集合中的最后一个对象;最后一个“可见”行(根据过滤条件,不一定在视口中可见);还是最近选择的行?
  • 我的意思是数据网格的最后一个可见行。

标签: c# wpf datagrid devexpress devexpress-wpf


【解决方案1】:

我假设“最后一行”是指由当前应用的排序和过滤确定的最后 可见 行(即,当您滚动到底部时最后出现的行,即目前可能不在视野中)。

有几种方法可以做到这一点,但这是最简单的(我认为),它不需要标记你的后备行对象[Serializable]

private void CopyLastRowToAnotherGrid()
{
    const int targetHandle = DataControlBase.NewItemRowHandle;

    GridControl source = /* your first grid */;
    GridControl target = /* your second grid */;

    if (source.VisibleRowCount < 1|| !target.IsValidRowHandle(targetHandle))
        return;

    var sourceHandle = source.GetRowHandleByVisibleIndex(source.VisibleRowCount - 1);

    // You can set ClipboardCopyMode in Xaml.  The point is, we want the
    // headers to be included so we can match the cells up in case the
    // user has reordered them.
    source.ClipboardCopyMode = ClipboardCopyMode.IncludeHeader;

    source.CopyRowsToClipboard(new[] { sourceHandle });

    var clipboardData = Clipboard.GetDataObject();

    var data = clipboardData?.GetData(DataFormats.Text) as string;
    if (data == null)
        return;

    var targetView = target.View as TableView;
    if (targetView == null)
        return;

    targetView.AddNewRow();

    var headersAndRows = data.Split('\n');
    var headers = headersAndRows[0].Split('\t');
    var columnValues = headersAndRows[1].Split('\t');
    var columnLookup = target.Columns.ToDictionary(o => o.HeaderCaption?.ToString());

    for (var i = 0; i < headers.Length; i++)
    {
        var header = headers[i];
        if (columnLookup.TryGetValue(header, out var column))
            target.SetCellValue(targetHandle, column, columnValues[i]);
    }

    // If you want to *move* the row, then uncomment this line to
    // delete the row from the first grid:
    //(source.View as TableView)?.DeleteRow(sourceHandle);
}

【讨论】:

  • 我可以将目标和源定义为同一个数据网格吗?
  • 是的,应该没问题。
【解决方案2】:

再次感谢 Mike Strobel,但我还为此提供了另一个解决方案。我在这里写给需要它的人。

和平

 private void dtg_tabletrial_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.D && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
        {

            DataGridTrialTable ff = new DataGridTrialTable();
            ff.Address = dtgtrialTable.LastOrDefault().Address;
            ff.UserName = dtgtrialTable.LastOrDefault().UserName;
            ff.Phone = dtgtrialTable.LastOrDefault().Phone;
            ff.Surname = dtgtrialTable.LastOrDefault().Surname;

            dtgtrialTable.Add(ff);
        }
    }

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 2013-08-31
    • 1970-01-01
    • 2012-01-16
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多