DgvDrag
项目场景:
这段代码定义了一个名为 ucDatagridviewHelper 的用户控件(UserControl),该控件包含了一个 DataGridView 控件和一些其他功能。
这段代码的主要部分:
构造函数:在构造函数中,初始化了用户控件的一些属性,设置了控件的样式以减少闪烁,订阅了 DataGridView 的一些事件(例如 MouseDown、DragOver、DragDrop 等),并且设置了双缓冲以优化性能。
MouseDown 事件处理程序:当鼠标按下时,如果是中键(MouseButtons.Middle),则获取鼠标点击的行和列索引,如果列索引为0,则将该行设置为拖动的行(draggingRow),并且开始拖拽操作。
DragOver 事件处理程序:处理拖放过程中的事件,设置拖放操作的效果为移动。
DragDrop 事件处理程序:处理拖放操作完成后的事件,获取拖放的目标行的索引,并将拖动的行插入到目标行的位置。
ProtocolParas 属性:该属性是一个类(Fox_Inverter_Remote_Protocol.ProtocolPara)的实例,用于管理协议参数。通过该属性的 get 和 set 方法,可以获取和设置 DataGridView 的数据源,并根据协议参数初始化 DataGridView。
cmb_op_SelectedIndexChanged 方法:根据不同的操作类型,显示或隐藏 DataGridView 的某些列。
InitialDatatable 方法:根据传入的故障信息列表,初始化 DataGridView 控件。该方法添加了 DataGridView 的列,并根据不同的类型设置列的可见性。然后,根据故障信息列表添加了 DataGridView 的行,并为每一行设置了单元格的值。
dataGridView1_CellMouseDoubleClick 事件处理程序:处理 DataGridView 单元格的双击事件。如果双击的是第5列(Address 列),则自动生成连续地址,并调用委托 UpdateAddress 更新地址。如果双击的是第7列(Value 列),则弹出一个富文本编辑器窗口,编辑单元格的值。
public class ProtocolPara
{
/// <summary>
/// 0 片读片写 1 片读单写 3 单读单写
/// </summary>
public int OperateMethod {
get; set; }
public string BlockName {
get; set; }
public List<string[]> Description {
get; set; } = new List<string[]>();
public UInt16 Address {
get; set; }
public UInt16 Length {
get; set; }
}
public partial class ucDatagridviewHelper : UserControl
{
public ucDatagridviewHelper()
{
InitializeComponent();
SetStyle(ControlStyles.Selectable, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);//忽略窗口消息,减少闪烁
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);//绘制到缓冲区,减少闪烁
SetStyle(ControlStyles.UserPaint, true);//控件由其自身而不是操作系统绘制
SetStyle(ControlStyles.ResizeRedraw, true);//控件调整其大小时重绘
dataGridView1.RowPostPaint += dataGridView1_RowPostPaint_1;
dataGridView1.MouseDown += DataGridView1_MouseDown;
dataGridView1.DragOver += DataGridView1_DragOver;
dataGridView1.DragDrop += DataGridView1_DragDrop;
Type dgvType = dataGridView1.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(dataGridView1, true, null);
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
public event Action<int> UpdateAddress;
void EnableDgv(DataGridView dgv,bool flag)
{
dgv.AllowUserToAddRows = flag;
dgv.AllowUserToResizeRows = flag;
dgv.AllowUserToDeleteRows = flag;
dgv.AllowUserToOrderColumns = flag;
dgv.AllowUserToResizeColumns = flag;
}
private DataGridViewRow draggingRow;
private void DataGridView1_MouseDown(object sender, MouseEventArgs e)
{
dataGridView1.AllowDrop = true;
if (e.Button == MouseButtons.Middle)
{
int rowIndex = dataGridView1.HitTest(e.X, e.Y).RowIndex;
int colIndex = dataGridView1.HitTest(e.X, e.Y).ColumnIndex;
if (rowIndex >= 0&&colIndex==0)
{
draggingRow = dataGridView1.Rows[rowIndex];
dataGridView1.DoDragDrop(draggingRow, DragDropEffects.Move);
}
}
}
private void DataGridView1_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void DataGridView1_DragDrop(object sender, DragEventArgs e)
{
int rowIndex = dataGridView1.HitTest(dataGridView1.PointToClient(new System.Drawing.Point(e.X, e.Y)).X, dataGridView1.PointToClient(new System.Drawing.Point(e.X, e.Y)).Y).RowIndex;
if (rowIndex >= 0)
{
dataGridView1.Rows.Remove(draggingRow);