Ram349 Ответов: 3

Перетащите проблему между двумя сетками данных в WPF


Всем Привет,
I'm developing an application in WPF, in it I use a DataGrids
Здесь я пытаюсь реализовать функцию перетаскивания между двумя сетками.Я пытаюсь перетащить строку из одной datagrid и перейти к другой datagrid.
Здесь я использую приведенный ниже код.
код XAML

 <DataGrid HorizontalAlignment="Left" AutoGenerateColumns="True" Name="SourceGrid" Margin="12,29,0,12" Width="325" PreviewMouseLeftButtonDown="SourceGrid_PreviewMouseLeftButtonDown" />
<DataGrid Name="DestGrid" AutoGenerateColumns="True" HorizontalAlignment="Right" AllowDrop="True" Margin="0,29,16,12" Width="325" Drop="DestGrid_Drop"/>

Код XAML.CS-это
private void SourceGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGrid parent = (DataGrid)sender;
            dragSource = parent;
            object data = GetDataFromSourceGrid(dragSource, e.GetPosition(parent));

            if (data != null)
            {
                DragDrop.DoDragDrop(parent, data, DragDropEffects.Move);
            }
        }
        private static object GetDataFromSourceGrid(DataGrid source, Point point)
        {
            UIElement element = source.InputHitTest(point) as UIElement;
            if (element != null)
            {
                object data = DependencyProperty.UnsetValue;
                while (data == DependencyProperty.UnsetValue)
                {
                    data = source.ItemContainerGenerator.ItemFromContainer(element);

                    if (data == DependencyProperty.UnsetValue)
                    {
                        element = VisualTreeHelper.GetParent(element) as UIElement;
                    }

                    if (element == source)
                    {
                        return null;
                    }
                }

                if (data != DependencyProperty.UnsetValue)
                {
                    return data;
                }
            }

            return null;
        }

        private void DestGrid_Drop(object sender, DragEventArgs e)
        {
            DataGrid parent = (DataGrid)sender;
            object data = e.Data.GetData(typeof(string));
            ((IList)dragSource.ItemsSource).Remove(data);
            parent.Items.Add(data);
        }


Здесь все работает нормально, но в
DestGrid_Drop
событие
object data = e.Data.GetData(typeof(string));
в этой строке я получаю нулевое значение.

Кто-нибудь из вас не мог бы мне помочь.

Что я уже пробовал:

я перепробовала столько статей.Тот же код, если я могу применить к спискам, он работает нормально.

3 Ответов

Рейтинг:
2

Maciej Los

Посмотрите на это:
WPF 4 DataGrid Row Drag and Drop | DotNetCurry[^]
Перетащите строку DataGrid в WPF[^]

Вы пропустили часть, которая отвечает за выбор строки.


Ram349

Привет Мацей Лос,
Спасибо, что откликнулись на мой пост.Я делаю перетаскивание строки из одной таблицы данных в другую таблицу данных.
Я попробовал твой, но он не сработал.Не могли бы вы поделиться каким-нибудь предложением?

Рейтинг:
2

Richard Deeming

Библиотека GongSolutions.WPF.DragDrop включает в себя пример перетаскивания между двумя сетками данных:
GitHub - punker76/gong-wpf-dragdrop: библиотека GongSolutions.WPF.DragDrop-это фреймворк drag'n'Drop для WPF[^]
гонг-с WPF-без dragdrop/DataGridSamples.XAML в Дев · punker76/гонг-МОФ-без dragdrop · на GitHub[^]


Maciej Los

:большой палец вверх:

Рейтинг:
2

PureNsanity

Если ваша исходная DataGrid имеет список строковых элементов (что я не знаю, почему вы действительно используете DataGrid в этом случае), то измените этот метод:

private void DestGrid_Drop(object sender, DragEventArgs e)
{
    DataGrid parent = (DataGrid)sender;
    object data = e.Data.GetData(typeof(string));
    ((IList)dragSource.ItemsSource).Remove(data);
    parent.Items.Add(data);
}

Измените его на:
private void DestGrid_Drop(object sender, DragEventArgs e)
{
    DataGrid parent = (DataGrid)sender;

    // If the DataObject contains string data, extract it.
    if (e.Data.GetDataPresent(DataFormats.StringFormat))
    {
        var data = (string)e.Data.GetData(DataFormats.StringFormat);
        ((IList)dragSource.ItemsSource).Remove(data);
        parent.Items.Add(data);
    }
}