Контекстное меню заголовка столбца и заголовка строки - PullRequest
1 голос
/ 10 января 2012

Я использую сетку данных WPF. Я предоставляю контекстное меню для заголовка строки и заголовка столбца. Код, как указано ниже:

MainWindow.xaml

<Window x:Class="WpfApplication10.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:cmd="clr-namespace:WpfApplication10"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.Resources>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="Insert Column Before" Command="cmd:ContextMenuCustomCommands.InsertColumnBeforeCommand" />
                        <MenuItem Header="Insert Column After" Command="cmd:ContextMenuCustomCommands.InsertColumnAfterCommand"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="{x:Type DataGridRowHeader}">
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem Header="Delete" Command="Delete"/>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </Grid.Resources>
    <Grid.CommandBindings>
        <CommandBinding Command="cmd:ContextMenuCustomCommands.InsertColumnBeforeCommand" CanExecute="InserColumnBefore_CanExecute" Executed="InserColumnBefore_Executed"/>
        <CommandBinding Command="cmd:ContextMenuCustomCommands.InsertColumnAfterCommand" CanExecute="InsertColumnAfter_CanExecute" Executed="InsertColumnAfter_Executed"/>
    </Grid.CommandBindings>
    <DataGrid x:Name="grdEmployee" ItemsSource="{Binding}" AutoGeneratingColumn="grdEmployee_AutoGeneratingColumn" LoadingRow="grdEmployee_LoadingRow" SelectionUnit="CellOrRowHeader">

    </DataGrid>
</Grid>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;
using System.Data.SqlClient;

namespace WpfApplication10
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private SqlConnection empCon = null;
        private SqlCommand empCmd = null;
        private DataSet empDS = null;
        private SqlDataAdapter empAdap = null;
        private string query = "SELECT * FROM Employees";
        public MainWindow()
        {
            InitializeComponent();

            this.grdEmployee.ItemsSource = this.GetEmployeeData().DefaultView;
        }

        private DataTable GetEmployeeData()
        {
            try
            {
                empCon = new SqlConnection(Application.Current.Properties["connectionStr"].ToString());
                empCmd = new SqlCommand(query, empCon);
                empAdap = new SqlDataAdapter(empCmd);
                empDS = new DataSet();
                empAdap.Fill(empDS);
            }
            catch (SqlException sqlEx)
            {
            }
            finally
            {
                if (empCon != null)
                    empCon.Dispose();

                if (empCmd != null)
                    empCmd.Dispose();
            }

            if (empDS != null)
            {
                for (int count = 1; count <= empDS.Tables[0].Columns.Count; count++)
                {
                    empDS.Tables[0].Columns[count - 1].ColumnName = Utility.ConvertNumber(count).ToString();
                }
                return empDS.Tables[0];
            }
            else
            {
                return null;
            }
        }

        private void grdEmployee_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {

        }

        private void grdEmployee_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            e.Row.Header = (e.Row.GetIndex() + 1).ToString();
        }

        private void InserColumnBefore_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        private void InserColumnBefore_Executed(object sender, ExecutedRoutedEventArgs e)
        {

        }

        private void InsertColumnAfter_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        private void InsertColumnAfter_Executed(object sender, ExecutedRoutedEventArgs e)
        {

        }
    }

    public class Utility
    {
        private static string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        public static string ConvertNumber(int number)
        {
            string result;
            number -= 1;
            int rest = number % 26;
            int q = number / 26;
            if (q == 0)
            {
                result = chars[rest].ToString();
            }
            else
            {
                result = ConvertNumber(q) + chars[rest];
            }
            return result;
        }
    }

    public static class ContextMenuCustomCommands
    {
        public static readonly RoutedUICommand InsertColumnBeforeCommand = new RoutedUICommand("Insert Column Before", "Insert Column Before", typeof(MainWindow));
        public static readonly RoutedUICommand InsertColumnAfterCommand = new RoutedUICommand("Insert Column After", "Insert Column After", typeof(MainWindow));
    }
}

App.xaml.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Windows;

namespace WpfApplication10
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
            string connectionStr = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=(local);";
            Application.Current.Properties["connectionStr"] = connectionStr;
        }
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что контекстное меню заголовка столбца остается отключенным до тех пор, пока я не получу доступ к сетке данных. Я не могу понять причину.

Пожалуйста, помогите мне. Дайте мне знать, если вам нужна другая информация.

1 Ответ

0 голосов
/ 10 января 2012

Как отмечалось выше, проблема, похоже, связана с тем, что DataGrid не был сфокусирован при нажатии.

Вызов gid.Focus(); в загруженном событии устранил проблему, сосредоточившись на GridView..

Что касается определения щелчка по столбцу, вы, вероятно, можете получить его с помощью обработчика событий, аналогичного получению подробной информации о ячейке и строке в этой статье

...