DataGridViewComboBoxColumn 可以让用户输入并自动匹配的选项的问题

TonyWu66 2008-12-24 01:07:24
使用以下方法解决了让用户输入并自动匹配选项的问题.但是发现如果全部使用键盘输入的话.当焦点移出此单元格后此单位元格未选中任何一项.显示为空.原因见代码中...

private void dgvInfoPerson_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dgvInfoPerson.CurrentCellAddress.X == dgvInfoPerson.Columns["colCboDeptNo"].Index)
{
cbo = e.Control as ComboBox;
if (cbo != null)
{
cbo.DropDownStyle = ComboBoxStyle.DropDown;
cbo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
}
}
}

private void dgvInfoPerson_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dgvInfoPerson.CurrentCellAddress.X == dgvInfoPerson.Columns["colCboDeptNo"].Index)
{
//问题出在这里.如果你输入的是ValueMember的值的话就没问题.但你如果输入的是DisplayMember的值的话就不会选中.
//如ValueMember="MAN" DisplayMember="管理部",如果你在此单元格输入MAN就没问题,但输入管理部就不会选中.但用户就应该是输入管理部
//而不是输入MAN.
dgvInfoPerson.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue;
}
}

已经搜过很多地方了.都没好的解决方案.还请各位有经验的前辈指点迷津.谢谢!
...全文
544 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
mystudy2012 2012-08-22
  • 打赏
  • 举报
回复
楼主,现在解决了没有,我也遇到了这样的问题,如果解决了麻烦你共享下解决的方法。
TonyWu66 2009-01-04
  • 打赏
  • 举报
回复
未得到满意答案.结贴
饺子87 2008-12-30
  • 打赏
  • 举报
回复
你就不会自己把ADD部分除去?



if (Items.IndexOf(value) == -1)
{
value=Items[0];//不在下拉默认为下拉0项,我的0项一般是"OFF"\"None",可以自己做判断处理的
}

hangang7403 2008-12-30
  • 打赏
  • 举报
回复
UP
wangping_li 2008-12-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 tonyepaper 的帖子:]
使用以下方法解决了让用户输入并自动匹配选项的问题.但是发现如果全部使用键盘输入的话.当焦点移出此单元格后此单位元格未选中任何一项.显示为空.原因见代码中...

private void dgvInfoPerson_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (dgvInfoPerson.CurrentCellAddress.X == dgvInfoPerson.Columns["colCboDeptNo"].Index)
{
cbo = e.Control as ComboBox;
if (cbo != null)
{
cbo.DropDownStyle = ComboBoxStyle.DropDown;
cbo.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
}
}
}

private void dgvInfoPerson_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (dgvInfoPerson.CurrentCellAddress.X == dgvInfoPerson.Columns["colCboDeptNo"].Index)
{
//问题出在这里.如果你输入的是ValueMember的值的话就没问题.但你如果输入的是DisplayMember的值的话就不会选中.
//如ValueMember="MAN" DisplayMember="管理部",如果你在此单元格输入MAN就没问题,但输入管理部就不会选中.但用户就应该是输入管理部 //而不是输入MAN.
dgvInfoPerson.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue;
}
}
[/Quote]
你指定了ComboBox的DisplayMember和ValueMember后,会按你输入的ValueMember来匹配的,如果输入的如果你说的管理员,它在valueMember中不存在,所以不会选中.这样的话和你设置的就矛盾了,所以应该换种思路,不一定要用comboBox,可以把当前编辑的当元格转换成TextBox,然后在TextBoxChanged里面写,至于下拉列表可以用一个listview来显示,只要把它显示在TextBox的下端坐标值即可.那样根据输入的值,listview自动找匹配的供用户自己选择
net5i 2008-12-29
  • 打赏
  • 举报
回复
而并不是由于搂主的其他代码的问题,另外DisplayMember的值运行时默认是Items属性的值
net5i 2008-12-29
  • 打赏
  • 举报
回复
噢,不好意思,没看清楚的问题原因。

搂主设置DisplayMember和ValueMember两个属性之后,输入框中就必须输入这两个属性所包含的成员内的字符串,
否则其他字符串被视为无效数据,所以输入列表中没有的成员,是无法显示的
net5i 2008-12-29
  • 打赏
  • 举报
回复
看搂主在1楼说得,那么这样改看看呢:
      /// <summary>
/// 按回车时模拟按下Tab键
/// </summary>
/// <param name="msg"></param>
/// <param name="keyData"></param>
/// <returns></returns>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
//先执行原来base.ProcessCmdKey中的处理
bool result = base.ProcessCmdKey(ref msg, keyData);
//判断键盘按下的键。如果等于“enter”,则send一个“{tab}”。模拟按下“tab”键,实现单元格。向下移动
if (keyData == Keys.Enter)
{
System.Windows.Forms.SendKeys.Send("{tab}");
return true;
}

return result;
}
TonyWu66 2008-12-29
  • 打赏
  • 举报
回复
顶一下.
TonyWu66 2008-12-27
  • 打赏
  • 举报
回复
谢谢您的回复.我的是WINFORM的系统.谢谢!
yagebu1983 2008-12-26
  • 打赏
  • 举报
回复
好像用js或者Ajax可以实现!!
TonyWu66 2008-12-26
  • 打赏
  • 举报
回复
12楼的前辈给是的 如果用户输入的不在下拉选项中时就Items.Add....不过我这里要的是..用户输入的必须在下拉选项中..所以不是我要的.谢谢!
flyjimi 2008-12-26
  • 打赏
  • 举报
回复
12楼,不是有人已经实现了吗,不能满足你的要求?
HDNGO 2008-12-26
  • 打赏
  • 举报
回复
关注一下~
TonyWu66 2008-12-26
  • 打赏
  • 举报
回复
帮顶有分.请高手出马.谢谢各位..
TonyWu66 2008-12-25
  • 打赏
  • 举报
回复
加到200分.请高手出马.谢谢!
TonyWu66 2008-12-24
  • 打赏
  • 举报
回复
我截了图.也做了DEMO.请各位前辈帮忙看看.谢谢!

DEMO下载http://download.csdn.net/source/903727
TonyWu66 2008-12-24
  • 打赏
  • 举报
回复
谢谢楼上回复.可惜不是我需要的.谢谢!
冰岛男孩 2008-12-24
  • 打赏
  • 举报
回复
public void ProcessHotkey(Message m) //按下设定的键时调用该函数
{
try
{
IntPtr id = m.WParam; //IntPtr用于表示指针或句柄的平台特定类型
//MessageBox.Show(id.ToString());
string sid = id.ToString();
switch (sid)
{
case "100":
additem.ShowDialog();
if (additem.DialogResult == DialogResult.OK)
{
dgItemSellList[4, dgItemSellList.CurrentCell.RowIndex].Value = additem.txtnum.Text.ToString();
}
break;
case "200":
if(MessageBox.Show("确定要关闭此窗体吗?","关闭提示",MessageBoxButtons.YesNo)==DialogResult.Yes)
this.Close();
break;
case "300":
fullpay = txttotal.Text;
billcode = txtbillcode.Text;
date = txtdate.Text;
handle = comhandle.Text;
cust = comcust.Text;
memo = txtMemo.Text;
SellDetail.SellPayment sell = new SellMain.SellDetail.SellPayment();
if (newitemtable.Rows.Count != 0)
{
sell.ShowDialog();
}
if (sell.DialogResult == DialogResult.OK)
{
txtsfull.Text = sell.txtfullpay.Text;
txtspay.Text = sell.txtpay.Text;
txtschange.Text = sell.txtchange.Text;
txttotal.Text = "";
txtallnum.Text = "";
newitemtable.Clear();
}
break;
}
}
catch { }
}

protected override void WndProc(ref Message m)//监视Windows消息
{
const int WM_HOTKEY = 0x0312;//如果m.Msg的值为0x0312那么表示用户按下了热键
switch (m.Msg)
{
case WM_HOTKEY:
ProcessHotkey(m);//按下热键时调用ProcessHotkey()函数
break;
}
base.WndProc(ref m); //将系统消息传递自父类的WndProc
}
TonyWu66 2008-12-24
  • 打赏
  • 举报
回复
自己顶下....请各位前辈出手相助.谢谢!
加载更多回复(9)
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,580

社区成员

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

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

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