主题:  DataView事件中的陷井

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#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)]

非常大鱼