【问题标题】:WPF Datagrid Hyperlink Right ClickWPF Datagrid超链接右键单击
【发布时间】:2009-12-02 09:47:38
【问题描述】:

我有一个数据网格,它有一个带有以下代码的超链接列:

<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>

如您所见,我使用单元格上的上下文菜单来获取它们的值,使用以下代码:

//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-

【问题讨论】:

    标签: wpf datagrid hyperlink mouseclick-event


    【解决方案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) {}
        }
    }
    

    【讨论】:

    • 是的,你所做的工作,因为它只是一个文本块。但是如果我添加一个带有超链接的模板列,那么它就不起作用了。
    • 什么是文本块?我使用了您提供的 XAML。
    • 使用“华尔街程序员”的代码示例对我来说也很好。我右键单击超链接单元格,出现上下文菜单,选择“复制”,然后将其粘贴到某处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多