高分求助,请教一个datagridview直接进行添加修改的问题

jcxpy910 2016-03-21 05:16:05
如题:在一个datagridview中,点击查询按钮后,会调用SQL中的存储过程并进行行列转换后将数据显示在datagridview中。如图:

上面显示的2016/3/18这种列,其实是数据表中“时间”这个字段的值,是经过行列转换后以一行的形式显示(如果不转换,时间就是以列的形式显示。)
问题:如果不经过行列转换,那么使用
 private void 查询_Click(object sender, EventArgs e)
{
SqlConnection sqlcon = new SqlConnection("server=WIN7U-20151010U;uid=sa;pwd=gsa4tb;database=xsxxdb");
SqlDataAdapter sda = new SqlDataAdapter();
try
{
if (ds.HasChanges())
{
sqlcon.Open();
//用SqlCommandBuilder自动为SqlDataAdapter生成Insert、Update、Delete命令

SqlCommandBuilder cb = new SqlCommandBuilder(sda);

sda.Update(ds);

dataGridView1.Update();

MessageBox.Show("保存成功!");

sqlcon.Close();
}
}
catch
{
MessageBox.Show("数据错误");

}




}

可以直接在datagridview中进行添加,修改。
现在进行行列转换过后,就不能进行添加,修改了。
请问有没有办法在转换过后也可以直接在datagridview中操作呢?
...全文
306 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jcxpy910 2016-04-21
  • 打赏
  • 举报
回复
@秋的红果实 @熊猫rrr @qq_26456659 @西门吹灯 @秋红的果实 @From_Taiwan
jcxpy910 2016-04-20
  • 打赏
  • 举报
回复
不行啊,解决不了,还是修改不了。我估计式sqlcommandbulider无法识别经过转换过后的行列数据,在进行数据传递时发现无法与数据库中的字段对应,请问各位大神到底应该怎么办才能实现这个功能啊,我研究了几个月了。。。。 呼唤大神 @熊猫rrr @qq_26456659 @西门吹灯 @秋红的果实 @From_Taiwan
熊猫rrr 2016-03-30
  • 打赏
  • 举报
回复
引用 13 楼 jcxpy910 的回复:
能不能给小弟一点参考的代码呢,各位大神

private void 查询_Click(object sender, EventArgs e)
        {
            SqlConnection sqlcon = new SqlConnection("server=WIN7U-20151010U;uid=sa;pwd=gsa4tb;database=xsxxdb");
            SqlDataAdapter sda = new SqlDataAdapter();
            try
            {
                if (ds.HasChanges())
                {
                    sqlcon.Open();
                    //用SqlCommandBuilder自动为SqlDataAdapter生成Insert、Update、Delete命令
 
                    //SqlCommandBuilder cb = new SqlCommandBuilder(sda);
                    //把上面这句注释掉,改成下面这样:

                    sda.UpdateCommand = new SqlCommand(
                       "Insert into CJ(ID, Name, 时间, Result) values(  @ID, @Name, @时间, @Result) " , conn);
                    sda.UpdateCommand.Parameters.Add...  //在这里添加命令的参数,就像你上面初始化sda的那样
                    //因为你在datagridview中对几个日期列的更改,反映在数据库中实际上是做插入处理的,所以在它的
                    // UpdateCommand中要手动的写好sql语句,你也可以在数据库中预先写好存储过程,然后在UpdateCommand
                   //中调用就行了

                    sda.Update(ds);
 
                    dataGridView1.Update();
 
                    MessageBox.Show("保存成功!");
 
                    sqlcon.Close();
                }
            }
            catch
            {
                MessageBox.Show("数据错误");
 
            }
 
 
 
             
        }
jcxpy910 2016-03-29
  • 打赏
  • 举报
回复
@熊猫rrr @qq_26456659 @西门吹灯
zjnuan 2016-03-29
  • 打赏
  • 举报
回复
上面的代码是争对读取数据库表到dte,dgv.datasourse=dte,这种情况的修改单元格内容并更新到数据库。用da.Update(dte)可以实现,用注释部分的代码也可以实现。 说几种引用表值的东东,dt是datatable,dgv是datagridview: 'dt.Rows(0)(0)'行列 'dt(0)(4)'行列 'dgv(0, 0).Value'列行 'dgv.Rows(i).Cells(0).Value'行列 'dgv.CurrentCell = dgv(0, 0)'列行
zjnuan 2016-03-29
  • 打赏
  • 举报
回复
sda.Update(ds);这东东感觉很脆弱,小小问题就没有实现效果。直接用SQLCommand更新到数据库(注释部分,懒得改了,你自己看看),有OleDb字眼的改成SQL的。
//更改datagridview单元格内容
public void cellchange(DataGridView dgv, OleDbDataAdapter da, DataTable dte)
{
	if (Interaction.MsgBox("是否修改该数据?", Constants.vbQuestion + Constants.vbYesNo) == Constants.vbYes) {
		builder = new OleDbCommandBuilder(da);
		dte.Rows.Find(dgv(dgv.DataSource.PrimaryKey(0).ToString, dgv.CurrentRow.Index).Value)(dgv.CurrentCell.ColumnIndex) = dgv.CurrentCell.Value;
		da.Update(dte);
		//conn.Open()
		//cmd = New OleDbCommand("update " & dgv.DataSource.ToString & " set " & dgv.Columns(dgv.CurrentCell.ColumnIndex).HeaderText & "=" & If(IsDBNull(dgv.CurrentCell.Value), "NULL", "'" & dgv.CurrentCell.Value & "'") & " where " & dgv.DataSource.PrimaryKey(0).ToString & "=" & dgv(dgv.DataSource.PrimaryKey(0).ToString, dgv.CurrentRow.Index).Value, conn)
		//cmd.ExecuteNonQuery()
		//conn.Close()
	} else {
		dgv.DataSource.RejectChanges();
	}
}
jcxpy910 2016-03-26
  • 打赏
  • 举报
回复
能不能给小弟一点参考的代码呢,各位大神
熊猫rrr 2016-03-23
  • 打赏
  • 举报
回复
看了你上面的代码,基本就可以确定了,问题主要出在这一行: SqlCommandBuilder cb = new SqlCommandBuilder(sda); CommangBuilder的作用是为你的DataAdapter自动生成insert、delete、update等command语句的,但前提是你的dataTable要与数据库中的表具有对映关系的,而你这里的DataTale中的列与数据库中的并没有对映关系,所以这里是不能用CommandBuilder的,需要手动设置这些command。方法是先创建几个sqlCommand对象,分别指定为insertCommand,deleteCommnad,updateCommand,在这些命令中设置好参数,并指定参数对应的是dataTable的哪一列就行了。详细的代码可以参考msdn上的示例: https://msdn.microsoft.com/zh-cn/library/33y2221y(VS.80).aspx
熊猫rrr 2016-03-22
  • 打赏
  • 举报
回复
引用 6 楼 jcxpy910 的回复:
怎么写啊,菜鸟就是不知道怎么写才发帖求助的 @熊猫rrr @qq_26456659
可是不知道你的数据库是怎么样的啊,要不你就把你的dataset和dataadapter的相关代码都贴出来,我看看有没有办法修改
jcxpy910 2016-03-22
  • 打赏
  • 举报
回复
怎么写啊,菜鸟就是不知道怎么写才发帖求助的 @熊猫rrr @qq_26456659
熊猫rrr 2016-03-22
  • 打赏
  • 举报
回复
可能是由于你DataAdapter的insert、delete、updateCommand属性没有写对吧,因为你这个datagridview中,那几个时间的列在数据库中是没有的,你要事先写好怎么处理那几个列的数据
jcxpy910 2016-03-22
  • 打赏
  • 举报
回复
不懂,只求来位高手给我说说怎么改
Justin-Liu 2016-03-22
  • 打赏
  • 举报
回复
自己写报错逻辑
jcxpy910 2016-03-22
  • 打赏
  • 举报
回复
对啊,有没有办法解决呢 @西门吹灯 @西门吹灯
jcxpy910 2016-03-22
  • 打赏
  • 举报
回复
不懂怎么配合。。我学这个没多久时间,现在凭自己的能力解决不了,能不能给我点代码?
血战31天 2016-03-22
  • 打赏
  • 举报
回复
datatable和datagridview配合使用
jcxpy910 2016-03-22
  • 打赏
  • 举报
回复
看这个图片。很明显,就是因为datagridview中显示了例如“2016/3/21”这种列,但是数据表中并没有“2016/3/21”这个字段,它是时间这个字段的一个值,只是经过行列转换后在控件中以这种形式显示。sqlcommand在datagridview执行添加的时候,数据表中没有这个列,所以就报错了。 求几位大神的帮助。 @秋红的果实 @西门吹灯 @道玄希言 @oysy @中国风
jcxpy910 2016-03-22
  • 打赏
  • 举报
回复
嗯。 查询事件按钮:
 SqlConnection conn = new SqlConnection("server=WIN7U-20151010U;uid=sa;pwd=gsa4tb;database=xsxxdb");
           // sda = new SqlDataAdapter("SELECT * FROM CJ where 科室='"+comboBox1.Text.ToString()+"' ", conn);

            SqlCommand cmd = new SqlCommand("dy ", conn);
            cmd.CommandType = CommandType.StoredProcedure;//
            cmd.Parameters.Add("@mm", SqlDbType.VarChar, 100).Value = comboBox1.Text;
            cmd.Parameters.Add("@nn", SqlDbType.VarChar, 100).Value = dateTimePicker1.Value.ToShortDateString();
            cmd.Parameters.Add("@aa", SqlDbType.VarChar, 100).Value = dateTimePicker2.Value.ToShortDateString();
            sda = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            ds.Clear();
            sda.Fill(ds);
            dataGridView1.DataSource = ds.Tables[0];
            dataGridView1.Show();
           // dataGridView1.Columns[0].Visible = false;
            dataGridView1.Rows[0].Selected = false;
SQLCOMMANDBULIDER(数据更新按钮):
SqlConnection sqlcon = new SqlConnection("server=WIN7U-20151010U;uid=sa;pwd=gsa4tb;database=xsxxdb");

            try
            {
                if (ds.HasChanges())
                {
                    sqlcon.Open();
                    //用SqlCommandBuilder自动为SqlDataAdapter生成Insert、Update、Delete命令

                    SqlCommandBuilder cb = new SqlCommandBuilder(sda);

                    sda.Update(ds);

                    dataGridView1.Update();

                    MessageBox.Show("保存成功!");

                    sqlcon.Close();
                }
            }
            catch
            {
                MessageBox.Show("数据错误");

            }
问题其实找到了,在数据库中的表是这个样子的: 我将本来应该以一列形式显示的时间转换成以一行的形式显示,那么在datagridview中添加数据的时候估计是insertcommand在数据表中找不到例如2016/3/21这个字段,所以即使添加了数据库里也保存不了。求各位大哥给我一点帮助 @熊猫rrr @qq_26456659
江南小鱼 2016-03-21
  • 打赏
  • 举报
回复
就是说ds.HasChanges()判断为false呗,也就是你说的现在进行行列转换过后,就不能进行添加,修改了
vb.net操作DataGridView控件的用法的集合,包括: 1. DataGridView当前的单元格属性取得、变更 2. DataGridView编辑属性 3. DataGridView最下面一列新追加行非表示 4. DataGridView判断当前选中行是否为新追加的行 5. DataGridView删除行可否设定 6. DataGridView行列不表示和删除 DataGridView控件用法合集(二) 7. DataGridView行列宽度高度设置为不能编辑 8. DataGridView行高列幅自动调整 9. DataGridView指定行列冻结 10. DataGridView列顺序变更可否设定 11. DataGridView行复数选择 12. DataGridView选择的行、列、单元格取得 DataGridView控件用法合集(三) 13. DataGridView指定单元格是否表示 14. DataGridView表头部单元格取得 15. DataGridView表头部单元格文字列设定 16. DataGridView选择的部分拷贝至剪贴板 17.DataGridView粘贴 18. DataGridView单元格上ToolTip表示设定(鼠标移动到相应单元格上时,弹出说明信息) DataGridView控件用法合集(四) 19. DataGridView中的ContextMenuStrip属性 20. DataGridView指定滚动框位置 21. DataGridView手动追加列 22. DataGridView全体分界线样式设置 23. DataGridView根据单元格属性更改显示内容 24. DataGridView新追加行的行高样式设置る 25. DataGridView新追加行单元格默认值设置 DataGridView中输入错误数据的处理(五) 26. DataGridView单元格数据错误标签表示 27. DataGridView单元格内输入值正确性判断 28. DataGridView单元格输入错误值事件的捕获 DataGridView控件用法合集(六) 29. DataGridView行排序(点击列表头自动排序的设置) 30. DataGridView自动行排序(新追加值也会自动排序) 31. DataGridView自动行排序禁止情况下的排序 32. DataGridView指定列指定排序 DataGridView控件用法合集(七) 33. DataGridView单元格样式设置 34. DataGridView文字表示位置的设定 35. DataGridView单元格内文字列换行 36. DataGridView单元格DBNull值表示的设定 37. DataGridView单元格样式格式化 38. DataGridView指定单元格颜色设定 39. DataGridView单元格文字字体设置 40. DataGridView根据单元格值设定单元格样式 DataGridView控件用法合集(八) 41. DataGridView设置单元格背景颜色 42. DataGridView行样式描画 43. DataGridView显示行号 44. DataGridView焦点所在单元格焦点框不显示的设定 DataGridView控件用法合集(九) 45. DataGridView中显示选择框CheckBox 46. DataGridView中显示下拉框ComboBox 47. DataGridView单击打开下拉框 48. DataGridView中显示按钮 49. DataGridView中显示链接 50. DataGridView中显示图像 DataGridView控件用法合集(十) 51. DataGridView编辑中单元格控件取得 52. DataGridView输入自动完成 53. DataGridView单元格编辑时键盘KEY事件取得 54. DataGridView下拉框(ComboBox)单元格编辑时事件取得 55. DataGridView下拉框(ComboBox)单元格允许文字输入设定 DataGridView控件用法合集(十一) 56. DataGridView根据值不同在另一列中显示相应图片 57. DataGridView中显示进度条(ProgressBar) 58. DataGridView添加MaskedTextBox DataGridView控件用法合集(十二) 59. DataGridView中Enter键按下焦点移至旁边的单元格 60. DataGridView行集合化(Group)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧