给DataGridViewComboBoxCell赋值的问题!

klmonabghq 2008-03-14 10:45:13
问题是这样的
我已经定义好了一个DataGridViewComboBox的列
在界面初始化的时候想给这一列赋初值
在尝试
dgv[0, i].Value="string";

后界面也能赋给初始值

但是这时候界面老是弹出如下错误



DataGridView中发生以下异常

System.ArgumentException:DataGridViewComboBoxCell值无效

要替换此默认对话框,请处理DataError事件



而且还弹出多个一样的错误提示框

我自己认为可能是所赋的字符串与DataGridView中ComboBox列的下拉选项的数据类型不一致
它可能定义为varchar(8),我赋值的字符串不是这个类型的

但是不知道如何解决,不知道有没有人遇到过同样的问题!

求解决方法



...全文
3882 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerry2060 2008-05-09
  • 打赏
  • 举报
回复
5楼的方法好使!谢谢noky!!!!!!
klmonabghq 2008-03-17
  • 打赏
  • 举报
回复
谢谢楼上各位的帮助
问题已经解决

出现这种问题有两种原因:1.数据类型不匹配 2.所赋数据项与绑定的数据源中数据不符
结贴!
klmonabghq 2008-03-17
  • 打赏
  • 举报
回复
不好意思

问题在这里,我给DataGridViewComboBoxColumn绑定的是char(10)
但是我给它的cell赋的值不是char(10)这个类型的

现在已经查明了是数据类型上存在问题
我再试试
谢谢ls了
yudi010 2008-03-17
  • 打赏
  • 举报
回复
总体来说就是创建combobox列,然后绑定焦点,然后是对事件操作
lz的应该是在创建的时候进行的操作,或者在事件里面进行操作
yudi010 2008-03-17
  • 打赏
  • 举报
回复
winform吗
如果是的话 这个问题我刚做了
可以帮你
web的话,也做过,好像比winform简单
我当时查找中国的网页没有,也是在日文的网站看到的,呵呵 技术无国界 不要愤青哦 问题解决就好
代码如下

[VB.NET]
Private dataGridViewComboBox As DataGridViewComboBoxEditingControl = Nothing

'EditingControlShowingイベントハンドラ
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing
'表示されているコントロールがDataGridViewComboBoxEditingControlか調べる
If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then
Dim dgv As DataGridView = CType(sender, DataGridView)

'該当する列か調べる
If dgv.CurrentCell.OwningColumn.Name = "ComboBox" Then
'編集のために表示されているコントロールを取得
Me.dataGridViewComboBox = _
CType(e.Control, DataGridViewComboBoxEditingControl)
'SelectedIndexChangedイベントハンドラを追加
AddHandler Me.dataGridViewComboBox.SelectedIndexChanged, _
AddressOf dataGridViewComboBox_SelectedIndexChanged
End If
End If
End Sub

'CellEndEditイベントハンドラ
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs) _
Handles DataGridView1.CellEndEdit
'SelectedIndexChangedイベントハンドラを削除
If Not (Me.dataGridViewComboBox Is Nothing) Then
RemoveHandler Me.dataGridViewComboBox.SelectedIndexChanged, _
AddressOf dataGridViewComboBox_SelectedIndexChanged
Me.dataGridViewComboBox = Nothing
End If
End Sub

'DataGridViewに表示されているコンボボックスの
'SelectedIndexChangedイベントハンドラ
Private Sub dataGridViewComboBox_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As EventArgs)
'選択されたアイテムを表示
Dim cb As DataGridViewComboBoxEditingControl = _
CType(sender, DataGridViewComboBoxEditingControl)
Console.WriteLine(cb.SelectedItem)
End Sub

[C#]
private DataGridViewComboBoxEditingControl dataGridViewComboBox = null;

//EditingControlShowingイベントハンドラ
private void DataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e)
{
//表示されているコントロールがDataGridViewComboBoxEditingControlか調べる
if (e.Control is DataGridViewComboBoxEditingControl)
{
DataGridView dgv = (DataGridView)sender;

//該当する列か調べる
if (dgv.CurrentCell.OwningColumn.Name == "ComboBox")
{
//編集のために表示されているコントロールを取得
this.dataGridViewComboBox =
(DataGridViewComboBoxEditingControl)e.Control;
//SelectedIndexChangedイベントハンドラを追加
this.dataGridViewComboBox.SelectedIndexChanged +=
new EventHandler(dataGridViewComboBox_SelectedIndexChanged);
}
}
}

//CellEndEditイベントハンドラ
private void DataGridView1_CellEndEdit(object sender,
DataGridViewCellEventArgs e)
{
//SelectedIndexChangedイベントハンドラを削除
if (this.dataGridViewComboBox != null)
{
this.dataGridViewComboBox.SelectedIndexChanged -=
new EventHandler(dataGridViewComboBox_SelectedIndexChanged);
this.dataGridViewComboBox = null;
}
}

//DataGridViewに表示されているコンボボックスの
//SelectedIndexChangedイベントハンドラ
private void dataGridViewComboBox_SelectedIndexChanged(object sender,
EventArgs e)
{
//選択されたアイテムを表示
DataGridViewComboBoxEditingControl cb =
(DataGridViewComboBoxEditingControl)sender;
Console.WriteLine(cb.SelectedItem);
}
九章落地 2008-03-17
  • 打赏
  • 举报
回复
楼主,你新建一个Form和DataGridView,再测试你上面这段代码试试.

我试了下你的代码,可以实现,也没见有弹出错误.
klmonabghq 2008-03-17
  • 打赏
  • 举报
回复
把帖子再顶一下
希望有达人解决一下!
klmonabghq 2008-03-15
  • 打赏
  • 举报
回复
ls的意思我有点明白,这里给个例子

List<string> ds = new List<string>();
for (int i = 0; i < 6; i++)
{
string tem = "string" + Convert.ToString(i)+" ";
ds.Add(tem);
}

DataGridViewComboBoxColumn column1 = new DataGridViewComboBoxColumn();
column1.HeaderText = "字符串";
column1.DataSource = ds;
this.dataGridView1.Columns.Add(column1);


for (int j = 0; j < 6; j++)
{
dataGridView1.Rows.Add();
dataGridView1[0,j].Value=Convert.ToString(ds[j]);
}

这是现在的代码实现,就会出现我所说的问题
请高手帮忙解决下,我对datagridviewcombox的操作确实不是很熟
谢谢!

peterb 2008-03-15
  • 打赏
  • 举报
回复
如果绑定了数据源,应该从数据源着手,设定对应列的默认值就可以
klmonabghq 2008-03-15
  • 打赏
  • 举报
回复
ls的大哥
我的DataGridViewComboBoxCell中的Items集合已经绑定了一个DataSource
你这样做是让我改变Items中的数据集

我的本意是本来DataGridViewComboBoxCell中已经有一些Items了,我是想对一个新建的空白的Cell进行赋值操作
所赋的值是Items集合中的一项

赋值可以实现,但界面老是报错
System.ArgumentException:DataGridViewComboBoxCell值无效 !
还是谢谢ls几位

看还有没有办法
noky 2008-03-15
  • 打赏
  • 举报
回复
如果你是动态添加ComBox中的数值哪么你需要显示的将有ComBox的Cell转换为DataGridViewComBoxCell类型,然后在Item中添加你的内容。
例如:
int index = this.dataGridView1.Rows.Add();
DataGridViewRow row = this.dataGridView1.Rows[index];
DataGridViewComboBoxCell cell = row.Cells[0] as DataGridViewComboBoxCell;
if (cell != null)
{
int tt = 1;
cell.Items.Add("string" + (++tt).ToString());
cell.Items.Add("string" + (++tt).ToString());
cell.Items.Add("string" + (++tt).ToString());
cell.Items.Add("string" + (++tt).ToString());
cell.Items.Add("string" + (++tt).ToString());
}
klmonabghq 2008-03-15
  • 打赏
  • 举报
回复
针对三位的建议,我都试过了
应该不是以上原因

DataGridViewComboBox值我能够初始化,可以看到初始化的界面
但就是这时候的窗体老是报错,极不稳定!

希望高人再给指点一下
celery94 2008-03-14
  • 打赏
  • 举报
回复
给DataGridViewComboBox赋值之前必须在Item里面有这个值
九章落地 2008-03-14
  • 打赏
  • 举报
回复
你要确保,赋值是在DataGridViewComboBox已经绑定了内容之后.
autonomyzone 2008-03-14
  • 打赏
  • 举报
回复
检查一下你的代码,可能是给这个ComboBox列的某个单元格赋了一个下列表里面的值.

111,089

社区成员

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

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

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