我正在寻找Windows Forms应用程序中C#的可能性:
DataGridViewSelectionMode.FullRowSelect
没有剪切它,因为我还需要能够选择独立的单元格。我需要在行复制中启用与DataGridViewSelectionMode.FullRowSelect
相同的行为,但需要DataGridViewSelectionMode.RowHeaderSelect
模式。这可能吗?
先谢谢。
答案 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);
}
}
解决方案和缺点
我最初的想法是通过处理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;
}
}
从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
有效......但后来被默认副本覆盖,我不知道发生了什么。结合这些想法来捕捉 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;
}
}