提一个DataGrid的Cell里加入ComboBox的问题,高分求解(.Net 2003)

冬官 2007-01-29 11:22:38
问题简要描述:
我用的.Net2003,我想把DataGrid的一列加入ComboBox,但DataGrid每一行的ComboBox的内容是不同的,所以我的办法是DataGrid的CurrentCellChange的时候,动态new一个ComboBox,填入内容,并指定SelectIndex或SelectValue
问题源码:
private void LoadProductColor(string ProductCode,string CellText)
{
if(ProductCode!="")
{
ComboBox cmbProductColor = new ComboBox();

cmbProductColor.Cursor=System.Windows.Forms.Cursors.Arrow;
cmbProductColor.DropDownStyle=ComboBoxStyle.DropDownList;
cmbProductColor.Dock= DockStyle.Fill;

m_ds_Color =m_pds.GetProductColorsByProductCode(ProductCode);
if(m_ds_Color.Tables["TProductColor"].Rows.Count==0)
MessageBox.Show("商品数据不全,根据商品编码找不到商品的颜色记录。","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
else
{
cmbProductColor.DataSource = m_ds_Color.Tables["TProductColor"];
cmbProductColor.DisplayMember = "ProductColor";
cmbProductColor.ValueMember = "PKID";
cmbProductColor.SelectedIndexChanged+=new System.EventHandler(this.cmbProductColor_SelectedIndexChanged);
cmbProductColor.SelectedValue = Convert.ToInt32(m_ds_Color.Tables["TProductColor"].Rows[0]["PKID"]);

DataGridTextBoxColumn dgtb=(DataGridTextBoxColumn)this.datagrid1.TableStyles["TPurchaseOrderItem"].GridColumnStyles[datagrid1.dataSource.Tables["TPurchaseOrderItem"].Columns.IndexOf("颜色")];
dgtb.TextBox.Controls.Clear();
dgtb.TextBox.Controls.Add(cmbProductColor);
if(CellText!="" && m_ds_Color.Tables["TProductColor"].Select("ProductColor" + " = '" + CellText + "'").Length>0)
{
int t;
t = Convert.ToInt32(m_ds_Color.Tables["TProductColor"].Select("ProductColor" + " = '" + CellText + "'")[0]["PKID"]);
cmbProductColor.SelectedValue = t;
}
}
}
}
我现在碰到的问题是:
第一,当我给DataSource,DisplayMember和ValueMember赋值以后,ComboBox的Items.Count仍旧是0,导致SelectedValue第一次赋值无效,调试的时候可以看到SelectedValue="未定义的值"。
第二,当dgtb.TextBox.Controls.Add(cmbProductColor);这句执行后,ComboBox的Items.Count有时会正确=2,有时会=0,尤其鼠标第一次点进DataGrid时,出现了奇怪的现象,单步调试到这语句执行完Count=0,但是如果过个1、2分钟,Count自己又会变成2,我什么也没做。换句话说,如果不设断点,程序执行肯定不是预期结果,如果在断点处停留几分钟,等Count变成2再运行下去,结果就是正确的了。

郁闷3天了,高分求解
...全文
254 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jcyluck 2007-01-29
  • 打赏
  • 举报
回复
Samen168 2007-01-29
  • 打赏
  • 举报
回复
Why总有人喜欢绕圈
冬官 2007-01-29
  • 打赏
  • 举报
回复
谢谢楼上的几位,不过你们根本没仔细看我的问题。

我不是不知道怎样添加ComboBox到DataGrid,我只是在给ComboBox预设SelectedValue初值的时候,不知道为什么语句实效了
灰太狼 2007-01-29
  • 打赏
  • 举报
回复
參見:如何在DataGrid中加入ComboBox控件
http://blog.csdn.net/tjvictor/archive/2007/01/22/1489807.aspx
Samen168 2007-01-29
  • 打赏
  • 举报
回复
或是找历史提问,N多这方面的
Samen168 2007-01-29
  • 打赏
  • 举报
回复
查MSDN关键字DataGridColumnStyle,里面有DataGrid列写的内容,包括示例,好像就是ComboBox的
panyijun 2007-01-29
  • 打赏
  • 举报
回复
我也碰到和你一样的问题,不过我是在2005下,不用DataGridViewComboBoxCell的原因是它没有SelectedValue等事件
冬官 2007-01-29
  • 打赏
  • 举报
回复
谢谢 sdl2005lyx,可惜我不会2005
sdl2005lyx 2007-01-29
  • 打赏
  • 举报
回复
lz: 你的要求无非是根据行中某一列的值,动态填充另一列的COMBOX,我这里在VS2005里用DataGridView实现类似的需要,现在给你贴出来,希望对你有所参考:
private void FillGrid()
{
DataGridViewRow dgr = null;
ArrayList blockArr = (ArrayList)this.Tag;

int count = blockArr.Count;
int i = 0; string first="";

dataGridView1.RowCount = count;
try
{
foreach (InPutBlock block in blockArr)
{
first = block.ParentDocument.FileName;
dgr=dataGridView1.Rows[i];
FillRow(first, ref dgr, block);
i++;
}

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void FillRow(string firstCol, ref DataGridViewRow dgr, InPutBlock inputBlock)
{
try
{
dgr.Cells[0].Value = firstCol;
dgr.Cells[1].Value = inputBlock.ValName;
dgr.Cells[2].Value = inputBlock.GetTabName();
//dgr.Cells[2].Tag = inputBlock.InType; //将输入端子类型附加到第二个单元格tag上
FillCommbox(inputBlock.InType);
DataGridViewComboBoxCell comCell = (DataGridViewComboBoxCell)dgr.Cells[3];
comCell.Items.AddRange(nameArr.ToArray());
if(inputBlock.PinName!="")
dgr.Cells[3].Value = inputBlock.PinName;

//dataGridView1.Rows.Add(dgr);
dgr.Tag = inputBlock; //为保存做准备,一行对应一个定值参数
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void FillCommbox(InputType type)
{
XmlFile xmlFile = new XmlFile(strResDir);

switch (type)
{
case InputType.AI:
xmlFile.LoadXml(strResDir + "\\AI.xml");
break;
case InputType.DI:
xmlFile.LoadXml(strResDir + "\\DI.xml");
break;
case InputType.FI:
xmlFile.LoadXml(strResDir + "\\Frequency.xml");
break;
case InputType.MI:
xmlFile.LoadTotalMeasure();
break;
case InputType.YI:
xmlFile.LoadXml(strResDir + "\\Pressboard.xml");
break;
}

nameArr =xmlFile.NameArr;
indexArr = xmlFile.IndexArr;

}

110,533

社区成员

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

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

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