首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2012-09-02 
DataGridViewComboBoxColumn 可以让用户输入并自动匹配的选项的问题使用以下方法解决了让用户输入并自动匹

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

C# code
        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;            }        }

已经搜过很多地方了.都没好的解决方案.还请各位有经验的前辈指点迷津.谢谢!

[解决办法]
C# code
            //判断键盘按下的键。如果等于“enter”,则send一个“{tab}”。模拟按下“tab”键,实现单元格。向下移动            if (keyData == Keys.Enter )            {                e.Handled = false;//加上这个试试。不行的话像下一句发送一个回车的按键消息                System.Windows.Forms.SendKeys.Send("{tab}");                return true;            }
[解决办法]
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
}
[解决办法]

真正的DataGridViewComboBoxColumn
[解决办法]
看搂主在1楼说得,那么这样改看看呢:

C# code
      /// <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;        }
[解决办法]
引用楼主 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;
}
}

[解决办法]
你就不会自己把ADD部分除去?

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

热点排行