2015-11-21 2 views
0

У меня есть класс Пользователь с несколькими полями типа string и int, у меня есть дататус, который отображает эти поля, я хочу, чтобы пользователь мог выбрать строку и нажать CTRL + C для копирования объекта, представляемого в буфер обмена, и когда пользователь нажимает CTRL + V (когда фокус находится на datagrid) добавит новую строку в datagrid. код:Копирование в буфер обмена и вставки событий

в XAML:

<DataGrid KeyDown="dgKeyDown" SelectionMode="Single" Name="dg1" 
      AutoGenerateColumns="False" CanUserAddRows="True" 
      CopyingRowClipboardContent="dg1Users_CopyingRowClipboardContent"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Name" Width="Auto" Binding="{Binding Name}"/> 
     <DataGridTextColumn Header="ID" Width="Auto" Binding="{Binding ID}" /> 
     <DataGridTextColumn Header="Age" Width="Auto" Binding="{Binding Age}"/> 
    </DataGrid.Columns> 
</DataGrid> 

dg1 товары Источник установлено значение наблюдаемой совокупности объектов пользователя:

dg1.ItemsSource = dg1Users; 

и копирования и вставки событий:

private void dg1Users_CopyingRowClipboardContent(object sender, DataGridRowClipboardEventArgs e) 
{ 
    User a = dg1.SelectedItem as User; 
    if (a != null) 
    { 
     Clipboard.Clear(); 
     Clipboard.SetData("User1", a); 
    } 
} 

private void dgKeyDown(object sender, KeyEventArgs e) 
{ 
    User a = null; 
    if (e.Key == Key.V && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) 
    { 
     if(Clipboard.ContainsData("User1")) 
     { 
      a = (User)Clipboard.GetData("User1"); 
      dg1Users.Add(a); 
     } 
    } 
} 

Это не работает, ничего не происходит, тестируя несколько заявлений на печать, я обнаружил, что w hen CTRL + Нажата кнопка V, код во втором, если в dgKeyDown не выполняется.

Что я делаю неправильно?

Примечание: Я НЕ использую шаблон MVVM.

ответ

1

Clipboard имеют Standart форматы:

  • CSV
  • Текст
  • UnicodeText
  • System.String
  • HTML формат

Я предпочитаю Registr мой пользовательский формат.

OK, 1) Первый набор [Serializable] атрибут

[Serializable] 
public class User 
{ 
    public string Name { get; set; } 

    public string ID { get; set; } 

    public string Age { get; set; } 
} 

2) Тогда REGIST формат (я сохранил его в собственность для отладки)

public DataFormat format { get; set; } 

и

format = DataFormats.GetDataFormat(typeof(User).FullName); 

3) Затем вы можете сохранить ваш объект следующим образом:

User a = dg1.SelectedItem as User; 
if (a != null) 
{ 
    IDataObject dataObj = new DataObject(); 
    dataObj.SetData(format.Name, a, true); 
    Clipboard.SetDataObject(dataObj, true); 
} 

4) Вы можете retrive объекта, как это:

User a = null; 
IDataObject dataObj = Clipboard.GetDataObject(); 
if (dataObj != null && dataObj.GetDataPresent(format.Name)) 
{ 
    a = dataObj.GetData(format.Name) as User; 
    dg1Users.Add(a); 
} 

5) Кроме того, мы имеем здесь проблему с событиями, которые я не знаю, как решить прямо сейчас

В вашем

private void dg1Users_CopyingRowClipboardContent(object sender, DataGridRowClipboardEventArgs e) 
    { 
    } 

вы должны подготовить данные для справки. Например, в e.ClipboardRowContent будет строка с данными из выбранной строки. Итак, после g1Users_CopyingRowClipboardContent все, что в e.ClipboardRowContent будет копировать. Это потому, что ваш if(Clipboard.ContainsData("User1")) ложный. Потому что в вашем буфере обмена в этот момент хранится строка.

Я изменил код:

private void dgKeyDown(object sender, KeyEventArgs e) 
    { 
     User a = null; 
     if(e.Key == Key.V && Keyboard.Modifiers == ModifierKeys.Control) 
     { 
      IDataObject dataObj = Clipboard.GetDataObject(); 
      if (dataObj !=null && dataObj.GetDataPresent(format.Name)) 
      { 
       a = dataObj.GetData(format.Name) as User; 
       dg1Users.Add(a); 
      } 
     } 
     else if (e.Key == Key.B && Keyboard.Modifiers == ModifierKeys.Control) 
     { 
      User copingUser = dg1.SelectedItem as User; 
      if (copingUser != null) 
      { 
       IDataObject dataObj = new DataObject(); 
       dataObj.SetData(format.Name, copingUser, true); 
       Clipboard.SetDataObject(dataObj, true); 
      } 
     } 
    } 

и в этом случае я могу скопировать-вставить выбранный элемент

EDIT: Потому что вы не используете MVVM, так что вы не используете ApplicationCommands и т.д. Таким образом, в в вашем случае вы можете установить команду NotACommand для команды «Копировать» как это. После этого вы можете изменить код для else if (e.Key == Key.C && Keyboard.Modifiers == ModifierKeys.Control). Я тестировал и работает так, как вы хотите.

<DataGrid KeyDown="dgKeyDown" SelectionMode="Single" Name="dg1" 
     AutoGenerateColumns="False" CanUserAddRows="True"> 
     <DataGrid.InputBindings> 
      <KeyBinding Key="C" Modifiers="Control" Command="ApplicationCommands.NotACommand"/> 
     </DataGrid.InputBindings> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" Width="Auto" Binding="{Binding Name}"/> 
      <DataGridTextColumn Header="ID" Width="Auto" Binding="{Binding ID}" /> 
      <DataGridTextColumn Header="Age" Width="Auto" Binding="{Binding Age}"/> 
     </DataGrid.Columns> 
    </DataGrid> 

 Смежные вопросы

  • Нет связанных вопросов^_^