以前用VB做程序,有PSPREAD那样的类似EXCEL的表格控件可以输入用,再不济也可用MSFlexGrid与Text控件结合来用作输入,那在C#中有类似用途的控件吗?c#中的datagrid恐怕不能自由输入编辑吧?

解决方案 »

  1.   

    自带的datagrid当然可以做到自由输入了
    用下面的代码就行
    public void SetGridStyleDataSouce_New(DataGrid Dg,DataTable Tb,string FrmName, bool AllowSorting,bool AllowAdd,string type,bool dg_readonly)
    {
    Dg.ReadOnly=dg_readonly; 
    DataGridTableStyle Dt=new DataGridTableStyle();
    DataGridTextBoxColumn Db;

    Tb.DefaultView.AllowNew=AllowAdd;//是否可自动增长
    if (Dg.TableStyles.Count>0)//如果此DataGrid已经存在一种样式则删除此样式
    {
    Dg.TableStyles.Remove(Dg.TableStyles[0]); //删除样式
    }
    Dg.DataSource=Tb;//设置DataGrid的数据源
    Dt.MappingName=Tb.TableName; int ColNum=Tb.Columns.Count;//得到Tb的列数
    for(int i=0;i<ColNum;i++)////重绘所有的列
    {
    Db=new DataGridTextBoxColumn();
    Db.TextBox.Name=Tb.Columns[i].ColumnName;//设置每一列的名字 注:为中文名
    Db.HeaderText=Tb.Columns[i].ColumnName;//设置每一列的列头为中文名
    Db.MappingName=Tb.Columns[i].ColumnName;
    Db.NullText="";//当Textbox为Null时转成空
    Db.TextBox.DoubleClick += new EventHandler(TextBoxDoubleClickHandler);
      
    switch(Tb.Columns[i].ColumnName)
    {
    case "a":
    Dt.PreferredColumnWidth= 60;
    break;
    case "b":
    Dt.PreferredColumnWidth= 50;
    break;
    case "c":
    Dt.PreferredColumnWidth= 100;
    break;
    }
    Dt.GridColumnStyles.Add(Db);//增加样式
    }
    Dt.AllowSorting=AllowSorting;//是否可排序 
    Dg.TableStyles.Add(Dt); //DATAGRID增加一种样式
    }
    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg , System.Windows.Forms.Keys keyData) //激活回车键
    {
    int WM_KEYDOWN=256;         
    int WM_SYSKEYDOWN = 260;
    Da.GridControl Dc=new Da.GridControl();
    if(this.ActiveControl is System.Windows.Forms.DataGridTextBox )
    {
       
    if(msg.Msg == WM_KEYDOWN | msg.Msg == WM_SYSKEYDOWN)
    {
    switch( keyData)
    { //case Keys.Down:
    // //MsgBox("截到下箭头键")
    // MessageBox.Show("下键");  
    // return true;
    // break;
    //case Keys.Up:
    // //MsgBox("截到上箭头键")
    // MessageBox.Show("上键");  
    // return true;
    case Keys.Delete:  
    //QuoteDetail.Rows[dataGrid1.CurrentCell.RowNumber].Delete();       
    // QuoteDetail.AcceptChanges();  
    break;
    case Keys.Enter:
         
    if(CheckDataGrid(this.dataGrid1) ==true)
    {

    switch (Dc.GetTextBoxName(dataGrid1,dataGrid1.CurrentCell.ColumnNumber).Name.ToString())
    {
    case "型号代码":
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    break;
    case "数量":
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    break;
    case "价格":
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    break;
    case "交货期":

    //SendKeys.Send("{Down}"); 

    SendKeys.Send("{Right}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    SendKeys.Send("{Tab}");
    break;
     
    default:
    SendKeys.Send("{Tab}");
    break;
    }

    }
    return true;
    //break;
    //case Keys.Control + Keys.V:
    // //<CTRL> + C 组合键)
    // //if( Me.ActiveControl.Parent.GetType Is GetType(DataGrid) And Me.Txt_Type.Text <> "CHAO HUO" Then
    // //    keyData = Keys.NoName
    // //End If // return true;
    // break;
    //case Keys.Alt + Keys.Z://                    'MsgBox("<ALT> + z 组合键被截获")
    // return true;
    // break;
    }
    }
    }
    return false;
    }
      

  2.   

    TO: cansum396(沉觉不醒) ,我不知道您的代码怎么用啊?拷贝到程序中后出好几个编译错误.我只是想让winform中的datagrid能像EXCEL那样随意输入,怎么做呢.我初学C#,您能讲得详细些吗?
      

  3.   

    vs2005中的DataGridView 还可以
      

  4.   

    我用的是vs2003,没有datagridview,听人说vs2005不太好用啊,没敢装