Связь события KeyDown с RowHeaderVisible из Datagridview - PullRequest
0 голосов
/ 01 октября 2010

Программное обеспечение, которое я использую: C #, VS-2005.

У меня есть заполненный список в datagridview. Я заметил, что когда для свойства datagridview RowHeaderVisible установлено значение false, событие управления нажатием не запускается. Но когда я устанавливаю RowHeaderVisible на true, событие keydown работает нормально.

Итак, я знаю, что свойство RowHeaderVisible со значением true будет работать. Но нет необходимости устанавливать его на true согласно моему требованию.

Я хочу знать причину такого поведения и как его преодолеть.

Мой код:

private void Form1_Load(object sender, EventArgs e)

{          
        string consstr = "server=.;initial   
        catalog=mydatabase;uid=myuserid;pwd=mypassword";
        SqlConnection conn = new SqlConnection(consstr);
        conn.Open();
        string sql = "select accname from AccountMast";
        SqlDataAdapter dap = new SqlDataAdapter(sql, conn);
        DataSet ds = new DataSet();
        dap.Fill(ds);
        DataTable dt = new DataTable();
        DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn();
        dataGridView1.Columns.Add(cmb);
        cmb.DataSource = ds.Tables[0];
        cmb.DisplayMember = "accname";
        cmb.ValueMember = "accname";
        dt.Columns.Add("AMOUNT", typeof(decimal));
        dataGridView1.DataSource = dt;
        dataGridView1.Columns[0].Width = 300;
        dataGridView1.Columns[1].Width = 143;
        dataGridView1.Columns[1].DefaultCellStyle.Format = "f2";
    }
   private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Alt == true && e.KeyCode == Keys.C) 
        {
            Form2 f2 = new Form2();
            f2.Show();
         }
    }

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

Вот и все. но есть проблема, вы можете увидеть это. согласно моему комментарию, лежащему ниже ответа "тергива".

Ответы [ 2 ]

1 голос
/ 02 октября 2010

Вот альтернативная форма, использующая ProcessCmdKey в форме вместо пользовательского DGV:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

class Form1 : Form
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    DataGridView dgv;

    public Form1()
    {
        Text = "Form1";

        dgv = new DataGridView();
        dgv.Dock = DockStyle.Fill;
        DataGridViewComboBoxColumn dgvColumn = new DataGridViewComboBoxColumn();
        dgvColumn.HeaderText = "Header";
        dgvColumn.DataSource = new string[] { "One", "Two", "Three", "Four" };
        dgv.Columns.Add(dgvColumn);
        Controls.Add(dgv);

        Button button = new Button();
        button.Text = "Place holder";
        button.Dock = DockStyle.Top;
        Controls.Add(button);
    }

    [DllImport("user32.dll")]
    private static extern bool IsChild(IntPtr hwndParent, IntPtr hwndChild);

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if ((keyData & (Keys.Alt | Keys.C)) == (Keys.Alt | Keys.C))
        {
            if (dgv.Handle == msg.HWnd || IsChild(dgv.Handle, msg.HWnd))
            {
                Form form = new Form();
                form.Text = "Form2";
                form.Show(this);
                return true;
            }
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}
0 голосов
/ 01 октября 2010

Управление не обеспечивает хороший способ для внешнего подключения в такой «командный ключ», как это. Лучшее место для поиска командных клавиш - переопределить ProcessCmdKey. Таким образом, у вас есть два варианта:

1) Переопределите ProcessCmdKey в своей форме и проверьте во время вызова, имеет ли DGV (или один из его дочерних элементов) фокус клавиатуры.

2) Создайте собственный DGV и переопределите там ProcessCmdKey.

В прошлом я использовал # 2 и создал что-то следующее для обеспечения внешнего доступа к событию (родительская форма).

Расширенный пример

using System;
using System.Windows.Forms;

class Form1 : Form
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    public Form1()
    {
        Text = "Form1";

        CustomDataGridView dgv = new CustomDataGridView();
        dgv.Dock = DockStyle.Fill;
        DataGridViewComboBoxColumn dgvColumn = new DataGridViewComboBoxColumn();
        dgvColumn.HeaderText = "Header";
        dgvColumn.DataSource = new string[] { "One", "Two", "Three", "Four" };
        dgv.Columns.Add(dgvColumn);
        dgv.CommandKeyPress += new CommandKeyPressHandler(dgv_CommandKeyPress);
        Controls.Add(dgv);

        Button button = new Button();
        button.Text = "Place holder";
        button.Dock = DockStyle.Top;
        Controls.Add(button);
    }

    bool dgv_CommandKeyPress(object sender, Keys keyData)
    {
        if ((keyData & (Keys.Alt | Keys.C)) == (Keys.Alt | Keys.C))
        {
            Form form = new Form();
            form.Text = "Form2";
            form.Show(this); 
            return true;
        }
        return false;
    }
}

delegate bool CommandKeyPressHandler(object sender, Keys keyData);

class CustomDataGridView : DataGridView
{
    public event CommandKeyPressHandler CommandKeyPress;

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        CommandKeyPressHandler eventDelegate = CommandKeyPress;
        if (eventDelegate != null)
        {
            foreach (CommandKeyPressHandler handler in eventDelegate.GetInvocationList())
            {
                if (handler(this, keyData))
                    return true;
            }
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...