سؤال

لدي 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>

حيث يمكنك أن ترى أنني استخدم سياقا في الخلايا للحصول على قيمتها، باستخدام التعليمات البرمجية التالية:

//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);
    }

من الواضح أن هذا لا يعمل على عمود الارتباط التشعبي لأنه هو templatecolumn.

هل هناك عمل عمل لا يزال بإمكانه الحصول على الرابط؟

حاولت مع قائمة السياق على الارتباط التشعبي نفسه، لكنها لم تنجح، كانت مراجع الكائنات خاطئة.

اشكرك كثيرا،

مع تحياتي،

-WTFudge-

هل كانت مفيدة؟

المحلول

يعمل رمزك بالنسبة لي، طالما أن المستخدم يختار الخلية التي يجب نسخها قبل فتح قائمة السياق. استخدمت أدناه رمز لاختبارها. ما المشكلة التي تشاهدها؟

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) {}
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top