【问题标题】:How to perform Drop operation into DataGridColumn?如何对 DataGridColumn 执行 Drop 操作?
【发布时间】:2017-05-18 12:44:20
【问题描述】:

我有一个项目,必须将数据从 excel 导入 SQL 数据库,Excel 信息未格式化,必须验证并与 SQL 列的表配对到我的应用程序中。

我有一个表示 SQL 列的 ListView 和一个表示 excel 信息的 Datagrid (AutoGenerateColumns = true)

现在用户必须将 ListView Items 与 DataGrid 列配对,我正在尝试使用 DragDrop 来完成,所有在 ListView 完成,但 Datagrid 是动态生成的,无法对每个列进行编程以设置 DragDrop 操作。

如何在这些自动生成的 DataGridColumns 上设置 DragDrop 操作?

有什么建议吗?

我正在寻找可以强制 DataGrid 使用我自己的 ImporDataGridColumn 的 DataGrid 属性:DataGridColumn 但找不到在哪里做。

更新: 终于可以添加我自己的列,但现在在列上找不到 AllowDrop....真是一场噩梦。

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    当 DataGrid 的 AutoGenerateColumns= False 时,您可以使用它的 Columns 属性在运行时添加 Columns。

    【讨论】:

    【解决方案2】:

    终于找不到直接的方法来执行我的下拉列... 然后我将AllowDrop = true 设置为我的数据网格。

    当对我的数据网格执行拖放操作时,我使用列宽搜索列。这是帮助我解决水平滚动偏移的代码(tks to @mm8

        private static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject
        {
            if (depObj == null)
                return null;
    
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                var child = VisualTreeHelper.GetChild(depObj, i);
    
                var result = (child as T) ?? GetChildOfType<T>(child);
                if (result != null)
                    return result;
            }
            return null;
        }
    
    
        private void DGrdDatosImportar_Drop(object sender, DragEventArgs e)
        {
    
            ScrollViewer sv = GetChildOfType<ScrollViewer>(DGrdDatosImportar);
            if (sv != null)
            {
                double horizontalOffset = sv.HorizontalOffset;
                var dropPos = e.GetPosition(DGrdDatosImportar);
                double relativeXPos = dropPos.X + horizontalOffset;
                double RefPos = DGrdDatosImportar.RowHeaderActualWidth;
                DataGridColumn SelecteCol = null;
                foreach (DataGridColumn Col in DGrdDatosImportar.Columns.ToList())
                {
                    double ColWidth = Col.ActualWidth;
                    if (relativeXPos >= RefPos && relativeXPos <= (RefPos + ColWidth))
                    {
                        SelecteCol = Col;
                        break;
                    }
                    RefPos += ColWidth;
                }
                if (SelecteCol != null)
                {
                    if (e.Data.GetDataPresent("IImportProperty"))
                    {
                       ...
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2017-04-29
      相关资源
      最近更新 更多