DataGridView使用CASE绑定数据源后更新出错

csbinchina 2009-07-27 03:22:45
如表info有3个字段 ,id identity,name varchar(8),sex byte 0:未知 1:男 2:女

绑定语句如下:
string sql = string.Format("select id,name as 姓名,CASE sex WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '未知' END as 性别 from info ");

dataAdapter = new SqlDataAdapter(sql, con);

commandBuilder = new SqlCommandBuilder(dataAdapter);

table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);


dataGridView1.DataSource = table;
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);


更新语句:
dataAdapter.Update(table);


现在的问题是执行更新语句后,姓名都可以更新,但是性别确更新不了. 各位大侠,怎么解决?
...全文
490 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
csbinchina 2009-07-28
  • 打赏
  • 举报
回复
如表info有3个字段 ,id identity,name varchar(8),sex byte 0:未知 1:男 2:女

绑定语句如下:
string sql = string.Format("select id,name as 姓名,CASE sex WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '未知' END as 性别 from info ");

dataAdapter = new SqlDataAdapter(sql, con);

commandBuilder = new SqlCommandBuilder(dataAdapter);

table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);


dataGridView1.DataSource = table;
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);


更新语句:
dataAdapter.Update(table);

现在添加了这个事件:
private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
if (e.ColumnIndex == 7)
{
string strValue = e.Value as string;
switch (strValue)
{
case "男":
e.Value = 1;
break;
case "女":
e.Value = 2;
break;
default:
e.Value = 1;
break;
}
e.ParsingApplied = true;//这一句很关键。

}
}
在此事件之后,保存时,如何将此更改更新到table?
sadikaqy 2009-07-28
  • 打赏
  • 举报
回复
学习~
风之影子 2009-07-28
  • 打赏
  • 举报
回复
你在DataGridView里编辑的时候转一下就可以了,参考代码:
C# code
//在这个事件可以由列和行的索引来决定是否退出或是执行。
private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
string strValue = e.Value as string;
switch (strValue)
{
case "男":
e.Value = 1;
break;
case "女":
e.Value = 2;
break;
case "未知":
e.Value = 0;
break;
}
e.ParsingApplied = true;//这一句很关键。
}



北京的雾霾天 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 csbinchina 的回复:]
我使用CellParsing事件后,确实更改了,但在保存时我查看了table的值,没有改过来.不知道怎么回事.

如果不用case,那怎么能达到这样的效果?
[/Quote]

你倒底是怎么做的啊。我怎么看不明白呢?
csbinchina 2009-07-28
  • 打赏
  • 举报
回复
我使用CellParsing事件后,确实更改了,但在保存时我查看了table的值,没有改过来.不知道怎么回事.

如果不用case,那怎么能达到这样的效果?
csbinchina 2009-07-28
  • 打赏
  • 举报
回复
hbxtlhx:依然存不进去.强烈建议你自己试一下. 我试过你的方法了,确实存不进去.
北京的雾霾天 2009-07-28
  • 打赏
  • 举报
回复
把数字显示成“男、女、未知”的是使用CellFormatting事件,虽然显示的是字符串,但内部存的还是整数。
把字符串“男、女、未知”转成数字的是CellParsing事件,虽然输入的是字符串,但转完后不还是整数?

你的Sql不要使用Case了,那样不正确。
北京的雾霾天 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 csbinchina 的回复:]
如果这样改的话,datagridview里对应的值将会变成 数字.这不是我想要的.
[/Quote]

我真是不明白,这么简单的问题怎么还是解决不了。怎么会出来什么数字呢?你直接输入男,女什么的不是就能存了吗?
csbinchina 2009-07-28
  • 打赏
  • 举报
回复
希望大家继续有好的解决办法. 有了更好的解决办法再结贴.谢谢......
csbinchina 2009-07-28
  • 打赏
  • 举报
回复
我用了一个很笨的方法将这个问题解决了. 实在是迫于无奈了.

我使用了2个table,一个保存原始值,一个保存显示值.修改的时候2个同时处理.保存时更新那个原始值的table就可以了. 但是感觉这样好笨.
csbinchina 2009-07-28
  • 打赏
  • 举报
回复
如果这样改的话,datagridview里对应的值将会变成 数字.这不是我想要的.
北京的雾霾天 2009-07-28
  • 打赏
  • 举报
回复
你在DataGridView里编辑的时候转一下就可以了,参考代码:

//在这个事件可以由列和行的索引来决定是否退出或是执行。
private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
string strValue = e.Value as string;
switch (strValue)
{
case "男":
e.Value = 1;
break;
case "女":
e.Value = 2;
break;
case "未知":
e.Value = 0;
break;
}
e.ParsingApplied = true;//这一句很关键。
}
csbinchina 2009-07-28
  • 打赏
  • 举报
回复
你所说的转化一下,是在那里转,table?dataGridView?... 最好给出示例代码.

既然绑定了,table和datagridview的值是一致的.实在想不出在哪里转. 不过,如farwy所说,可以写更新语句,但这种不知道怎么写.
北京的雾霾天 2009-07-28
  • 打赏
  • 举报
回复
你在编辑结束的时候转一下,或者使用一个组合框把值和文本对应起来。
zzmoutmans 2009-07-28
  • 打赏
  • 举报
回复
回帖是一种美德!
zhushoudong 2009-07-28
  • 打赏
  • 举报
回复
你要放数字的吗 你就判断你的男的 就对应相应的数字就行了
wuyq11 2009-07-28
  • 打赏
  • 举报
回复
在datagridview里通过DataGridViewComboBoxColumn下拉框显示性别,再更新数据
参考
if (e.ColumnIndex==SexColumn.Index)
if (e.Value==0)
e.Value="男"
北京的雾霾天 2009-07-28
  • 打赏
  • 举报
回复
不是还有一个CellFormatting事件吗?这里不是转换了吗?
csbinchina 2009-07-28
  • 打赏
  • 举报
回复
不用CASE,下面的代码就没有意义了. 都是数字了,就不用转了.
string strValue = e.Value as string;
switch (strValue)
{
case "男":
e.Value = 1;
break;
case "女":
e.Value = 2;
break;
default:
e.Value = 1;
break;
}
e.ParsingApplied = true;//这一句很关键。
北京的雾霾天 2009-07-28
  • 打赏
  • 举报
回复
select id,name as 姓名,CASE sex WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '未知' END as 性别
------------------
都说了不用case了。
加载更多回复(13)

110,536

社区成员

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

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

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