#12004/10/13 2:25:22
我用DataView填充一个列表框,因填充的内容是几个项的并列显示,而且要考虑每列的对齐,所以不能直接绑定。因此写了如下填充列表框的函数
public void ResetMInfo(string strFilter)
{
string strCode, strName, strSpec;
lstMInfo.Items.Clear();
// 设置视图的过滤选项
dvMInfo.RowFilter = "Disable = false ";
if (strFilter != string.Empty && strFilter != "")
{
try
{
dvMInfo.RowFilter += "AND " + strFilter;
}
catch
{
MessageBox.Show("商品选项过滤条件错误,请更正。", "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
if (dvMInfo.Count == 0)
{
return;
}
for (int i = 0; i < dvMInfo.Count; i++)
{
strCode = dvMInfo[i]["Code"].ToString();
strName = dvMInfo[i]["BrandAndName"].ToString();
strSpec = dvMInfo[i]["Spec"].ToString();
lstMInfo.Items.Add(Utility.FixLengthString(Utility.FixLengthString(strCode, 15) + strName ,42) + strSpec);
}
}
当检查代码确实无误,运行,但结果得不到过滤效果。我有点百思不得其解,明明代码很正确的。
结果突然想到DataView用了个事件,即ListChanged事件,是视图数据发生变化发生的。代码如下
private void dvMInfo_ListChanged(object sender, ListChangedEventArgs e)
{
string strCode, strName, strSpec;
if ( dvMInfo.Count == 0 ) return;
lstMInfo.Items.Clear();
for (int i = 0; i < dvMInfo.Count; i++)
{
strCode = dvMInfo[i]["Code"].ToString();
strName = dvMInfo[i]["BrandAndName"].ToString();
strSpec = dvMInfo[i]["Spec"].ToString();
lstMInfo.Items.Add(Utility.FixLengthString(Utility.FixLengthString(strCode, 15) + strName ,42) + strSpec);
}
}
原来是这个事件搞了鬼,我上面过滤一变化,马上触发这个事件,使列表框的Item.Clear()白忙了。最后修改了代码,用一标志加判断,结果正确了。
写程序有时会忽略一些事件发生,原因也不好找,如果有时忘了有该事件设定。
编辑历史:[此帖最近一次被 蓝鲸 编辑过(编辑时间:2004-10-13 02:30:23)]
非常大鱼