winfrom中,
1、如何向datagrid中添加控件?如ComboBox,textBox等,求C#方法
2、添加后如何取得这个控件中的值?
3、若datagrid某一行或几行中的值发生变化,在向数据库更新时,如何仅更新这几行的内容,而不更新其他未发生变化的数据行?
4、若datagrid发生插入一行或几行新数据的事件,如何判断和仅向数据库中插入这几行新数据?
5、如何删除datagrid中的指定行的数据内容,并同时删除对应数据库中的值?
6、文件FROM1.CS中动态输入的值,如何在FROM2.CS、from3.cs中调用这些动态值?(web中可以使用session,那winfrom中呢?)
刚从web编程转到winfrom编程,发现很多东西都不一样,请大家回答时写的尽量详细些,谢谢了。

解决方案 »

  1.   


    问题还真多啊!
    1,2
    http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c44c.aspx
    上面有例子(有源码)
    3,4,5
    可以在datagrid中取到某条记录的主键值,通过主键值来进行数据库更新删除
    6
    可以在form2,3中写set方法
    在form1中实例form2,3时把值set给它们
      

  2.   

    //在DataGrid的TextBox中添加一个DateTimePicker控件,同理可以添加Combox
    DataGridTableStyle  dtStyle = new DataGridTableStyle();
    this.dataGrid1.TableStyles.Add(dtStyle);
    dtStyle.AllowSorting = true;
    GridColumnStylesCollection colStyle = dataGrid1.TableStyles[0].GridColumnStyles;
    colStyle[0].Width = 110;

    DataGridTextBoxColumn dgText = (DataGridTextBoxColumn)this.dataGrid1.TableStyles[0].GridColumnStyles[0]; 
    DateTimePicker dp = new DateTimePicker();
    dp.Cursor = Cursors.Arrow;
    dp.Dock = DockStyle.Fill;

    dp.ValueChanged +=new EventHandler(dp_ValueChanged);
    dgText.TextBox.Controls.Add(dp);
    //把控件值赋给TextBox
    private void dp_ValueChanged(object sender, EventArgs e)
    {
    this.dataGrid1[this.dataGrid1.CurrentCell] = ((DateTimePicker)sender).Value.ToString("yyyy-MM-dd");
    }2:、3、4、5
    ((DataTable)dgGrid.DataSource)拿到编辑以后的DataGrid的数据源,
    DataRow[] rowAdded=this.Body[0].Select("","PKID",DataViewRowState.Added);
    DataRow[] rowModified=this.Body[0].Select("","PKID",DataViewRowState.ModifiedCurrent);
    DataRow[] rowDeleted=this.Body[0].Select("","PKID",DataViewRowState.Deleted);

    foreach (DataRow theRow in rowAdded)
    {
                                   //do Something
    }

    foreach(DataRow theRow in rowModified)
    {
       //do Something } foreach(DataRow theRow in rowDeleted)
    {
         //do Something
    }      
    每个DataRow对象都有一个DataRowState的属性,拿到这个值做相应的操作。6:方法很多啊,看你有什么需求,如果就是简单的拿回TextBox之类的值,用属性即可。
      

  3.   

    1、这个问题我一般用XTRA GRID这个控件解决.里面有COLUMNEDIT属性可以设置
    2、直接根据行列找到该值
    3、你可以在控件中值发生改变时触发的时间中把经过改变的行记录下来,提交时构建一个只有这几行数据的表
    4、这一条其实和上一条差不多
    5、我的做法是将删除的的唯一标识记录下来,在数据库中删除
    6、使用全局静态的属性
      

  4.   

    1,2上面有例,
    3,4可参考dataset的getchanges方法;
    5用clickchanges事件来确定单元格,然后可以找到这一行的每个值
    DataGridCell currentCell = dataGridP.CurrentCell;
    DataTable dataTable = (DataTable)dataGridP.DataSource;
    Object[] myRows = new Object[7];
    myRows = dataTable.Rows[currentCell.RowNumber].ItemArray;
    string strRows = (string)myRows[0]; 
    然后用存储过程或Sql命令访问数据库。
    6,用全局静态属性,记得在Form()中传递过去。别在另一窗体new时赋初值了。
      

  5.   

    谢谢大家的答复。
    我昨天尝试了,可是,还是无法向datagrid中添加控件呀
    采用http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c44c.aspx中提示的方法,程序执行完成,但没有显示ComboBox控件呀。
    采用wxm4585(穿拖鞋的男人) 的方法,系统中断提示:colStyle[0].Width = 110;这行索引超出边界?至于剩下的3、4、5问题解决方法,我还在尝试;6的问题,用全局静态属性,这个能不能说得详细些或举个例子,刚从web编程转到winfrom编程,感觉很多东西很是陌生呀,请大家多多帮忙呀,谢谢啦!
      

  6.   

    添加控件,
    http://blog.csdn.net/zhzuo/archive/2004/05/31/22036.aspx
    多记录更新,
    http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
      

  7.   

    private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
    string conn="Provider=MSDAORA;Data Source=......(正确的链接)
    OleDbConnection oleconn=new OleDbConnection(conn); OleDbDataAdapter myad=new OleDbDataAdapter("SELECT *  FROM "+e.Node.Text  +"" ,oleconn); DataSet myset=new DataSet();
    myad.Fill(myset);
    this.dataGrid1.DataSource=myset;
    GridColumnStylesCollection colStyle = dataGrid1.TableStyles[0].GridColumnStyles;
    for(int i=0;i<myset.Tables [0].Columns .Count ;i++)
    {
    if(colStyle[i].HeaderText.ToUpper () =="ID")
    {
    colStyle[i].ReadOnly =true;

    }
    }
    }错误提示GridColumnStylesCollection colStyle = dataGrid1.TableStyles[0].GridColumnStyles;索引超出边界?
    请问:这是怎么回事?已经动态将数据表的内容添加给了dataGrid1了呀,为什么取不到dataGrid1整行整列的值?方法不对吗?请大家指点一下吧。
      

  8.   

    关于3、4、5问题:
    ((DataTable)dgGrid.DataSource)拿到编辑以后的DataGrid的数据源,
    请问,如何“拿到编辑以后的DataGrid的数据源”,代码中怎么写呢?不是很明确如何去做呀。DataRow[] rowAdded=this.Body[0].Select("","PKID",DataViewRowState.Added);
    尝试使用以上的代码去编辑DataGrid中新添加的数据,但是,当仅添加一行时,rowAdded.count却是0,添加2行时却仅是1;这是怎么回事?如何解决呀。3,4可参考dataset的getchanges方法;
    该方法也牵扯“编辑以后的DataGrid的数据源”吧。能讲的明确写吗?谢谢啦
      

  9.   

    colStyle[0].Width = 110这句没什么用,只是给dataGrid动态加载了一个TableStyle样式,然后设置了宽度。关键你要拿到DataGridTextBoxColumn 这个实例。
    参见:DataGridTextBoxColumn dgText = (DataGridTextBoxColumn)this.dataGrid1.TableStyles[0].GridColumnStyles[0]; 拿到编辑以后的数据源?DataTable dt = ((DataTable)dgGrid.DataSource)这不是已经贴出来了吗?你可以不用判断dt中DataRow的State,直接去做DataAdapter.Update(),我那样写,只是我的需求不一样,要根据状态来操作。
      

  10.   

    在From1.cs中 From2 frm = new From2();实例化一个From2的对象,如果你在From2中用public来修饰成员变量的话,就可以直接拿到这个值,当然一般我们都不这样做。私有的成员变量应该用类的属性来获取和赋值它,参见:
    class From2
    {
         public string txtValue
         {
                get{return txt.Text;}
                set{txt.Text = value;}
         }
         private TextBox txt }From1.cs中  From2 frm = new From2();
            string GetValue = frm.txtValue;
      

  11.   

    谢谢wxm4585(穿拖鞋的男人) 的答复。如果直接去做DataAdapter.Update(),那数据量很大的时候应该会很慢吧。如果用判断dt中DataRow的State的方法,那调用DataViewRowState.Added、DataViewRowState.ModifiedCurrent都可以直接判断添加、修改,
    但现在判断DataViewRowState.Deleted这个状态有疑问,不清楚如何合理的触发该属性呀;
    如果先使用“del”键删除datagrid中的行,再调用事件执行数据库的删除作业,这样作似乎不太符合常见的操作习惯;能不能直接使用“del”键来调用删除事件?或者实现类似的功能?如果使用选择行的方法删除,那如何才能知道哪几行数据被选中呢?并且似乎还要屏蔽“del”功能,这个屏蔽不清楚怎么作呀。
      

  12.   

    DataRowStaus是只读属性,对DataTable的任何操作,在没有调用dt.AcceptChanges()之前,DataTable的每一个DataRow都有DataRowStatus属性来标明当前行的状态。做DataAdapter.Update()方法的时候,它也是根据这个属性值来生成相应的Sql语句来提交的。
         确实如果数据量比较大效率比较低,因为它要扫描所有的DataRow的DataRowStatus的属性值,当然你也可以调用dt.GetChanges()方法来重新构造一个只包含DataRowState.Added 、DataRowState.Deleted 、DataRowState.Modified三种状态的DataTable来做更新。
      

  13.   

    如果先使用“del”键删除datagrid中的行,再调用事件执行数据库的删除作业,这样作似乎不太符合常见的操作习惯;能不能直接使用“del”键来调用删除事件?或者实现类似的功能?
    这样没什么不合常规的啊,至于直接用"del"键来调用方法,是可以的,论坛里有相关帖子,自己搜索一下。
      

  14.   

    将datagrid中的某列设置为“只读”,若选中该“只读”列中的某项值时,再使用添加、更新或删除操作后,那个选中的“只读”项会在屏幕中遗留一个值,这个显示的值,通过刷新或重载数据表的方法无法让他消失呀,这应该是一个显示问题,但怎么才能让他不出现能或者通过程序刷新掉呢?
      

  15.   

    那个选中的“只读”项会在屏幕中遗留一个值,不知道这是什么意思。“只读”只是对当前处于编辑状态的DataGrid的Column无法编辑。