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、如何向datagrid中添加控件?如ComboBox,textBox等,求C#方法
2、添加后如何取得这个控件中的值?
3、若datagrid某一行或几行中的值发生变化,在向数据库更新时,如何仅更新这几行的内容,而不更新其他未发生变化的数据行?
4、若datagrid发生插入一行或几行新数据的事件,如何判断和仅向数据库中插入这几行新数据?
5、如何删除datagrid中的指定行的数据内容,并同时删除对应数据库中的值?
6、文件FROM1.CS中动态输入的值,如何在FROM2.CS、from3.cs中调用这些动态值?(web中可以使用session,那winfrom中呢?)
刚从web编程转到winfrom编程,发现很多东西都不一样,请大家回答时写的尽量详细些,谢谢了。
问题还真多啊!
1,2
http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c44c.aspx
上面有例子(有源码)
3,4,5
可以在datagrid中取到某条记录的主键值,通过主键值来进行数据库更新删除
6
可以在form2,3中写set方法
在form1中实例form2,3时把值set给它们
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之类的值,用属性即可。
2、直接根据行列找到该值
3、你可以在控件中值发生改变时触发的时间中把经过改变的行记录下来,提交时构建一个只有这几行数据的表
4、这一条其实和上一条差不多
5、我的做法是将删除的的唯一标识记录下来,在数据库中删除
6、使用全局静态的属性
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时赋初值了。
我昨天尝试了,可是,还是无法向datagrid中添加控件呀
采用http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c44c.aspx中提示的方法,程序执行完成,但没有显示ComboBox控件呀。
采用wxm4585(穿拖鞋的男人) 的方法,系统中断提示:colStyle[0].Width = 110;这行索引超出边界?至于剩下的3、4、5问题解决方法,我还在尝试;6的问题,用全局静态属性,这个能不能说得详细些或举个例子,刚从web编程转到winfrom编程,感觉很多东西很是陌生呀,请大家多多帮忙呀,谢谢啦!
http://blog.csdn.net/zhzuo/archive/2004/05/31/22036.aspx
多记录更新,
http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
{
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整行整列的值?方法不对吗?请大家指点一下吧。
((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的数据源”吧。能讲的明确写吗?谢谢啦
参见:DataGridTextBoxColumn dgText = (DataGridTextBoxColumn)this.dataGrid1.TableStyles[0].GridColumnStyles[0]; 拿到编辑以后的数据源?DataTable dt = ((DataTable)dgGrid.DataSource)这不是已经贴出来了吗?你可以不用判断dt中DataRow的State,直接去做DataAdapter.Update(),我那样写,只是我的需求不一样,要根据状态来操作。
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;
但现在判断DataViewRowState.Deleted这个状态有疑问,不清楚如何合理的触发该属性呀;
如果先使用“del”键删除datagrid中的行,再调用事件执行数据库的删除作业,这样作似乎不太符合常见的操作习惯;能不能直接使用“del”键来调用删除事件?或者实现类似的功能?如果使用选择行的方法删除,那如何才能知道哪几行数据被选中呢?并且似乎还要屏蔽“del”功能,这个屏蔽不清楚怎么作呀。
确实如果数据量比较大效率比较低,因为它要扫描所有的DataRow的DataRowStatus的属性值,当然你也可以调用dt.GetChanges()方法来重新构造一个只包含DataRowState.Added 、DataRowState.Deleted 、DataRowState.Modified三种状态的DataTable来做更新。
这样没什么不合常规的啊,至于直接用"del"键来调用方法,是可以的,论坛里有相关帖子,自己搜索一下。