.netWinform中DataGrid是否可以多选,请教

解决方案 »

  1.   

    DataGrid本身没有这个功能,要自己实现。
      

  2.   


                for (int i = 0; i < 3; i++)
                {
                    datagrid.Select(i);
                }
      

  3.   

    /// <summary>
    /// MultSelectGrid 的摘要说明。
    /// </summary>
    public class MultSelectGrid : System.Windows.Forms.DataGrid
    {
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; private ArrayList m=new ArrayList(); public MultSelectGrid()
    {
    // 该调用是 Windows.Forms 窗体设计器所必需的。
    InitializeComponent(); // TODO: 在 InitComponent 调用后添加任何初始化
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if( components != null )
    components.Dispose();
    }
    base.Dispose( disposing );
    } #region 组件设计器生成的代码
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器 
    /// 修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    components = new System.ComponentModel.Container();
    }
    #endregion protected override void OnPaint(PaintEventArgs pe)
    {
    // TODO: 在此添加自定义绘画代码 // 调用基类 OnPaint
    base.OnPaint(pe);
    }
    public int[] MultiSelectedIndexs
    {
    get
    {
    return (int[])m.ToArray(typeof(int));
    }
    } protected override void OnMouseDown(MouseEventArgs e)
    {
    if(e.Button==System.Windows.Forms.MouseButtons.Left)
    {
    DataGrid.HitTestInfo hit=HitTest(e.X,e.Y);
    if(this.HitDataGrid(hit))
    {
    try
    {
    base.OnMouseDown(e);
    }
    catch(Exception ex)
    {
       MessageHelper.ShowMessage(ex.Message);
    }
    }
    }
    else
    base.OnMouseDown(e); }
    private bool HitDataGrid(HitTestInfo hit)
    {
    try
    {
    switch(DataGrid.ModifierKeys)
    {
    case Keys.Control:
    if(hit.Row>-1)
    {
    if(m.IndexOf(hit.Row)>-1)
    {
    m.Remove(hit.Row);
    this.UnSelect(hit.Row);
    }
    else
    {
    m.Add(hit.Row);
    this.Select(hit.Row);
    }
    }
    return false;
    case Keys.Shift:
    if(hit.Row>-1)
    {
    foreach(int i in m)
    {
    this.UnSelect(i);
    }
    m.Clear();
    int low;
    int hight;
    if(hit.Row>this.CurrentRowIndex)
    {
    hight=hit.Row;
    low=this.CurrentRowIndex;
    }
    else
    {
    hight=this.CurrentRowIndex;
    low=hit.Row;
    }
    for(int i=low;i<=hight;i++)
    {
    m.Add(i);
    this.Select(i);
    }
    }
    return false;
    default:
    foreach(int i in m)
    {
    this.UnSelect(i);
    }
    m.Clear();
    if(hit.Type==DataGrid.HitTestType.RowHeader)
    {
    m.Add(hit.Row);
    }
    return true;
    }
    }
    catch(System.Exception ex)
    {
    System.Diagnostics.Debug.WriteLine(ex.ToString());
    }
    return true;
    }
    // protected override void OnMouseMove(MouseEventArgs e)
    // {
    // if(e.Button==System.Windows.Forms.MouseButtons.Left)
    // {
    // DataGrid.HitTestInfo hit=HitTest(e.X,e.Y);
    // if(this.HitDataGrid(hit))
    // {
    // base.OnMouseMove(e);
    // }
    // }
    // }
    // protected override void OnMouseHover(EventArgs e)
    // {
    // base.OnMouseHover (e);
    // }
    protected override void OnMouseUp(MouseEventArgs e)
    {
    base.OnMouseUp (e);
    } protected override bool ProcessCmdKey(ref Message msg,Keys keyData)
    {
    // if ( keyData==Keys.Delete )
    // {
    // if(MessageHelper.ShowMessageResult("您确实要执行此操作吗?") == DialogResult.No) 
    // {
    // 
    // return true; 
    // }
    // else
    // {
    //   return base.ProcessCmdKey(ref msg,keyData);
    // }
    // }
    // else
    // return base.ProcessCmdKey(ref msg,keyData); switch(keyData)
    {

    case Keys.Delete:
    if(MessageHelper.ShowMessageResult("您确实要执行此操作吗?") == DialogResult.No) 
    {
     
    return true; 
    }
    else
    {
    return base.ProcessCmdKey(ref msg,keyData);
    }
    //break;
    case Keys.Enter: SendKeys.Send("{Tab}");
    return true;
    }
    return base.ProcessCmdKey(ref msg,keyData); } }