Вопрос

I have two identical datagrids (datagrid1, datagrid2), I want to drag the datagridrow from populated datagrid1 to identical datagrid2, but I am having no joy, the dragdrop seems to work, I can see the row I have selected when debugging but when I drop it into datagrid2 it adds a blank row with no data? I presume my code in the drop event is wrong but I can't see where. Can anyone help me fill in the blanks?

Thanks for your help as always.

Here is my code

namespace DataGridDragNDrop
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Persons persons = new Persons();

            List<Persons> list = new List<Persons>()
            {
                new Persons(){ Name="Brian", Province="Aberdeenshire", City="Ellon", Age=55 }, 
                new Persons(){ Name="Stuart", Province="Dumbartonshire", City="Dumbarton", Age=27 },
                new Persons(){ Name="Harry", Province="Wiltshire", City="Wimborne", Age=31 }
            };

            datagrid1.DataContext = list;
        }

        private void datagrid1_MouseMove(object sender, MouseEventArgs e)
        {
            if(e.LeftButton == MouseButtonState.Pressed)
            {
                Persons person = (Persons)datagrid1.SelectedItem;

                DataObject dragData = new DataObject("dragData", person);
                DragDrop.DoDragDrop(datagrid1, dragData, DragDropEffects.Move);
            }
        }

        private void datagrid2_DragEnter(object sender, DragEventArgs e)
        {
            e.Effects = DragDropEffects.Move;
        }

        private void datagrid2_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent("dragData"))
            {
                Persons person = e.Data.GetData("dragData") as Persons;
                DataGrid datagrid2 = sender as DataGrid;
                datagrid2.Items.Add(person.Name + person.City + person.Province + person.Age);
            }
        }
    }
}


XAML

<Grid>
        <DataGrid Name="datagrid1" AutoGenerateColumns="False" ItemsSource="{Binding}" CanUserAddRows="False" Margin="109,58,149,0" Height="105" VerticalAlignment="Top" IsReadOnly="True" MouseMove="datagrid1_MouseMove">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
                <DataGridTextColumn Header="County" Binding="{Binding Province}"></DataGridTextColumn>
                <DataGridTextColumn Header="City" Binding="{Binding City}" Width="*"></DataGridTextColumn>
                <DataGridTextColumn Header="Age" Binding="{Binding Age}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid Name="datagrid2" AutoGenerateColumns="False" CanUserAddRows="True" AllowDrop="True" Margin="109,183,149,25" IsReadOnly="True" DragEnter="datagrid2_DragEnter" Drop="datagrid2_Drop">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"></DataGridTextColumn>
                <DataGridTextColumn Header="County" Binding="{Binding Province}"></DataGridTextColumn>
                <DataGridTextColumn Header="City" Binding="{Binding City}" Width="*"></DataGridTextColumn>
                <DataGridTextColumn Header="Age" Binding="{Binding Age}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
Это было полезно?

Решение

Change

datagrid2.Items.Add(person.Name + person.City + person.Province + person.Age);

to

datagrid2.Items.Add(person);

P.S.: untested, but that a + b + c + d look suspicious.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top