在RowHeaderSelect模式

时间:2015-09-30 10:25:06

标签: c# datagridview selection

我正在寻找Windows Forms应用程序中C#的可能性:

  1. 一次选择多个完整行。
  2. 在所选行之间包含未选择的行。
  3. 然后将它们复制到剪贴板,没有空格(留给未选择的行)。
  4. DataGridViewSelectionMode.FullRowSelect没有剪切它,因为我还需要能够选择独立的单元格。我需要在行复制中启用与DataGridViewSelectionMode.FullRowSelect相同的行为,但需要DataGridViewSelectionMode.RowHeaderSelect模式。这可能吗?

    先谢谢。

1 个答案:

答案 0 :(得分:0)

首先,为此,我们将手动删除默认复制结果中的空行。我们将调用以下方法:

private void StripEmptyFromCopy()
{
    string[] separated = Clipboard.GetText().Split('\n').Where(s => !String.IsNullOrWhiteSpace(s)).ToArray();
    string copy = String.Join("\n", separated);

    if (!String.IsNullOrEmpty(copy))
    {
        Clipboard.SetText(copy);
    }
}

解决方案和缺点

  1. 我最初的想法是通过处理DataGridView.KeyUp事件来检查用户输入 Ctrl + C

    private void dataGridView1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.C && (Control.Modifiers & Keys.Control) == Keys.Control)
        {
            StripEmptyFromCopy();
            e.Handled = true;
        }
    }
    
    • 如果首先释放 C ,则工作正常。如果首先释放 Ctrl ,则空行仍在剪贴板中。
  2. DataGridView创建您自己的课程并覆盖ProcessCmdKey

    public class CopyDataGridView : DataGridView
    {
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == (Keys.Control | Keys.C))
            {
                StripEmptyFromCopy();
                return false;
            }
    
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
    
    • 在调用True后返回StripEmptyFromCopy会阻止剪贴板获取副本。返回False有效......但后来被默认副本覆盖,我不知道发生了什么。
  3. 结合这些想法来捕捉 Ctrl + C ,无论在KeyUp事件处理程序中首先发布了哪个键:

    public class CopyDataGridView : DataGridView
    {
        public bool Copying { get; set; }
    
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            Copying = keyData == (Keys.Control | Keys.C);
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
    
    // And in the form:
    copyDataGridView1.KeyUp += CopyDataGridView1_KeyUp;
    
    private void CopyDataGridView1_KeyUp(object sender, KeyEventArgs e)
    {
        if (copyDataGridView1.Copying)
        {
            StripEmptyFromCopy();
            copyDataGridView1.Copying = false;
            e.Handled = true;
        }
    }
    
    • 这是更多的工作,但与选项1相比,它提供了一致的结果。