combobox动态数据源,加载不到数据时报错

dong127 2012-04-13 06:27:01
功能需求是这样的:
根据输入的值在数据库中模糊查询匹配的数据,并显示在下拉框列表中,当有值可选时,自动打开下拉框,
除非选中下拉框中的某一个数据,否则要保持用户输入的数据不变



namespace WindowsFormsApplication1
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
// 构造数据
loaddata();
}
// 构造数据源
private DataTable mdataSource = new DataTable();
// 特殊出标志
private bool flag = false;
private DataTable dtfliter = new DataTable();

// 初始化数据
/// <summary>
/// 构造数据
/// </summary>
private void loaddata()
{
DataTable dt = new DataTable();
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("value", typeof(string));
DataRow dr0 = dt.NewRow();
dr0["name"] = string.Empty;
dr0["value"] = "0";
dt.Rows.Add(dr0);
DataRow dr1 = dt.NewRow();
dr1["name"] = "1X#-100";
dr1["value"] = "1X#-100";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["name"] = "1X#-1200";
dr2["value"] = "1X#-1200";
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3["name"] = "abc";
dr3["value"] = "3";
dt.Rows.Add(dr3);

DataRow dr4 = dt.NewRow();
dr4["name"] = "time";
dr4["value"] = "4";
dt.Rows.Add(dr4);

DataRow dr5 = dt.NewRow();
dr5["name"] = "this is a max length string to test if the dropdownwith is autochange";
dr5["value"] = "5";
dt.Rows.Add(dr5);
DataRow dr6 = dt.NewRow();
dr6["name"] = "date";
dr6["value"] = "6";
dt.Rows.Add(dr6);
DataRow dr7 = dt.NewRow();
dr7["name"] = "time and date";
dr7["value"] = "7";
dt.Rows.Add(dr7);
dt.AcceptChanges();
mdataSource = dt;
BindDate(mdataSource);
}

private void BindDate(DataTable dt)
{
this.comboBox1.DataSource = dt;
this.comboBox1.DisplayMember = "name";
this.comboBox1.ValueMember = "value";

comboBox1.SuspendLayout();
}


/// <summary>
/// combobox 输入事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void comboBox1_KeyUp(object sender, KeyEventArgs e)
{try{
if (this.comboBox1.Text == string.Empty)
{
BindDate(mdataSource);
this.comboBox1.Text = string.Empty;
return;
}
flag = false;
string str = this.comboBox1.Text;
// 根据输入的值自带筛选
bool validate = Fillter(str);

// 现实下拉框
this.comboBox1.DroppedDown = true;
// 输入无效的数据

this.comboBox1.Text = str;
if (comboBox1.Text != null && comboBox1.Text != string.Empty)
{
// 获得光标位置
this.comboBox1.SelectionStart = comboBox1.Text.Length;
}


// 现实鼠标
this.comboBox1.Cursor = Cursors.Default;
}
catch (Exception ex) {
MessageBox.Show(ex.Message);
}

}

/// <summary>
/// 筛选匹配的值
/// </summary>
/// <param name="str"></param>
private bool Fillter(string str)
{
bool isvalida = true;
DataTable dt = mdataSource.Clone();
// 循环筛选匹配的值
foreach (DataRow dr in mdataSource.Rows)
{
int i = -1;
i = dr["name"].ToString().IndexOf(str.ToString());
if (i > -1)
{
DataRow newrow = dt.NewRow();
newrow.ItemArray = dr.ItemArray;
// 构造新的数据
dt.Rows.Add(newrow);
}

}
dt.AcceptChanges();
BindDate(dt);
// 当为一条数据要特殊处理/不然光标返回有问题
if (dt.Rows.Count == 1)
{
// 特殊处理标志
flag = true;
this.comboBox1.Text = str;// str 参数为输入的值;
int len = str.Length;

}

return isvalida;
}

}
}


当输入的值在下拉数据源中查找不到时,会出现如下错误:

InvalidArgument=“0”的值对于“index”无效。 参数名: index


有人碰到过这种情况么?
...全文
215 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdmh 2012-04-16
  • 打赏
  • 举报
回复
调试吧,这个错误未必是上面代码产生的,你是不是还有其他代码,比如selectechanged之类的事件,当没有记录时,你没有判断,依然通过索引访问,就要出错了
cheng2005 2012-04-16
  • 打赏
  • 举报
回复
懒的说,你自己都知道发生问题的原因了,自己不会想办法解决?
找不到数据你说怎么办?你让别人怎么帮你,你自己应该最清楚找不到数据应该怎么处理。
dong127 2012-04-16
  • 打赏
  • 举报
回复
是的,

比如当没有输入值的时候,下拉列表框中有如下数据:
1
2
3
4
当我输入5的时候,过滤完数据,下拉列表框中没有数据显示,但是就会报错了..

是需要哪里做设置来防止这个错误发生,还是我的代码写的有问题呢?

请高手帮忙看看,分析下
surlew 2012-04-16
  • 打赏
  • 举报
回复
是不是你设置的值不在你绑定的数据中
dong127 2012-04-16
  • 打赏
  • 举报
回复
没人来帮我解答一下这个问题么?
dong127 2012-04-16
  • 打赏
  • 举报
回复
自己顶一下..没人来么?

110,536

社区成员

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

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

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