2009-12-02 8 views
0

I가 다음 코드로 하나의 하이퍼 링크 열이있는 데이터 그리드 :WPF DataGrid에 하이퍼 링크를 마우스 오른쪽 클릭

<dg:DataGrid Style="{StaticResource DataGridStyle}" x:Name="movieGrid" 
     ItemsSource="{Binding ElementName=This, Path=movieData}"> 
     <dg:DataGrid.ContextMenu> 
      <ContextMenu Name="cm"> 
       <MenuItem Header="Copy" Click="CopyCell_Click"/> 
      </ContextMenu> 
     </dg:DataGrid.ContextMenu> 
     <dg:DataGrid.Columns> 
      <dg:DataGridTemplateColumn x:Name="editColumn" Width="40" Header="Edit" CanUserResize="False"> 
       <dg:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Button Content="Edit" Height="20" Tag="{Binding Path}" Click="Edit_Click"/> 
        </DataTemplate> 
       </dg:DataGridTemplateColumn.CellTemplate> 
      </dg:DataGridTemplateColumn> 
      <dg:DataGridTextColumn x:Name="titleColumn" IsReadOnly="True" Binding="{Binding Title}" Header="Title" SortDirection="ascending" /> 
      <dg:DataGridTextColumn Visibility="Collapsed" x:Name="titleDiffColumn" IsReadOnly="True" Binding="{Binding IMDBTitle}" Header="IMDBTitle" /> 
      <dg:DataGridTextColumn x:Name="scoreColumn" IsReadOnly="True" Width="60" Binding="{Binding Score}" Header="Score" /> 
      <dg:DataGridTextColumn x:Name="yearColumn" IsReadOnly="True" Width="60" Binding="{Binding Year}" Header="Year" /> 
      <dg:DataGridTextColumn x:Name="genreColumn" IsReadOnly="True" Binding="{Binding Genre}" Header="Genre" /> 
      <dg:DataGridTemplateColumn x:Name="linkColumn" Width="195" Header="Link"> 
       <dg:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Margin="3,0,0,0"><Hyperlink Tag="{Binding Link}" Click="Link_Click"><TextBlock Text="{Binding Link}"/></Hyperlink></TextBlock> 
        </DataTemplate> 
       </dg:DataGridTemplateColumn.CellTemplate> 
      </dg:DataGridTemplateColumn> 
      <dg:DataGridCheckBoxColumn x:Name="seenColumn" Width="60" Binding="{Binding Seen}" Header="Seen"/> 
     </dg:DataGrid.Columns> 
    </dg:DataGrid> 

u는 내가 다음 코드를 사용하여, 자신의 가치를 얻기 위해 세포에서의 ContextMenu를 사용하여 볼 수 있듯이 :

//copy datagrid item 
    private void CopyCell_Click(object sender, RoutedEventArgs e) 
    { 
     DataRowView itemsSource = movieGrid.CurrentItem as DataRowView; 
     int index = movieGrid.CurrentColumn.DisplayIndex; 
     string cellValue = itemsSource.Row.ItemArray[index - 1].ToString(); 
     Clipboard.SetData(DataFormats.Text, cellValue); 
    } 

하이퍼 링크 열은 템플릿 열이므로 분명히 작동하지 않습니다.

아직 링크를 복사 할 수있는 작업 영역이 있습니까?

하이퍼 링크 자체에서 상황에 맞는 메뉴를 시도했지만 작동하지 않았습니다. 개체 참조가 잘못되었습니다.

감사 무리

관련,

-WtFudgE-

답변

1

귀하의 코드는 한 사용자가 컨텍스트 메뉴를 열기 전에 복사 취득해야하는 셀을 선택으로, 나를 위해 작동합니다. 나는 그것을 테스트하기 위해 아래의 코드를 사용했다. 무슨 문제가 보이니?

using System.Data; 
using System.Windows; 

namespace GridLinkTest 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      DataContext = this; 

      DataTable dataTable = new DataTable("MovieData"); 
      dataTable.Columns.Add(new DataColumn("Title")); 
      dataTable.Columns.Add(new DataColumn("IMDBTitle")); 
      dataTable.Columns.Add(new DataColumn("Score")); 
      dataTable.Columns.Add(new DataColumn("Year")); 
      dataTable.Columns.Add(new DataColumn("Genre")); 
      dataTable.Columns.Add(new DataColumn("Link")); 
      dataTable.Columns.Add(new DataColumn("Seen")); 

      DataRow row = dataTable.NewRow(); 
      row["Title"] = "Watchmen"; 
      row["IMDBTitle"] = "Watchmen"; 
      row["Score"] = 7.8; 
      row["Year"] = 2009; 
      row["Genre"] = "Action"; 
      row["Seen"] = true; 
      row["Link"] = "www.imdb.com/title/tt0409459"; 
      dataTable.Rows.Add(row); 

      movieData = new DataView(dataTable); 
     } 

     public DataView movieData { get; set;} 

     private void CopyCell_Click(object sender, RoutedEventArgs e) 
     { 
      DataRowView itemsSource = movieGrid.CurrentItem as DataRowView; 
      int index = movieGrid.CurrentColumn.DisplayIndex; 
      string cellValue = itemsSource.Row.ItemArray[index - 1].ToString(); 
      Clipboard.SetData(DataFormats.Text, cellValue); 
     } 

     private void Edit_Click(object sender, RoutedEventArgs e) {} 

     private void Link_Click(object sender, RoutedEventArgs e) {} 
    } 
} 
+0

네가하는 일은 단지 텍스트 차단이기 때문입니다. 하지만 하이퍼 링크가있는 templatecolumn을 추가하면 작동하지 않습니다. – WtFudgE

+0

텍스트 블록이란 무엇입니까? 제공된 XAML을 사용했습니다. –

+1

"Wallstreet Programmer"의 코드 샘플을 사용하여 저에게 잘 작동합니다. 하이퍼 링크 셀을 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴가 나타나면 "복사"를 선택한 다음 어딘가에 붙여 넣으십시오. – SuperOli

관련 문제