在這種情況下,怎麼過濾掉comboBox裡面的重復項...

lanye_purple 2006-12-29 04:46:32
看代碼:

public class ComboBoxItem
{
//為ComboBox添加value和text值
private string _text=null;
private object _value=null;
public string Text{get{return this._text;} set{this._text=value;}}
public object Value{get {return this._value;}
set{this._value=value;}}
public override string ToString()
{
return this._text;
}
}

private void addComboBox()
{
DataView dataView = new DataView();
dataView = Agent_DataLayer.DsPositionAndStaff.StaffAndPosition.Copy().DefaultView;
dataView.RowFilter = "MarkId <> 0";
foreach(DataRowView drv in dataView)
{
int strVal = int.Parse(drv["staffId"].ToString());
string strText = drv["ItemFull"].ToString().Trim();
//(看下面一段,問題就在這裡,程序運行後,依然出現重復的strText)
if(!this.cmbStaffInfo.Items.Contains(strText))//過濾重復 {
ComboBoxItem newItem = new ComboBoxItem();
newItem.Text = strText; //添加text值
newItem.Value = strVal; //添加value值
this.cmbStaffInfo.Items.Add(newItem);
}
}
}
...全文
183 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
其实这个问题重写Equals就可以了,在ComboBox.Item.Contains方法里的参数虽是Object类型,但是这个Object需是Item的类型,你向Items添加的是ComboBoxItem类型的元素,那么这个Contains的参数Object也应是ComboBoxItem类型的,而你传的是String的,所以不行.
要正确的返回结果就是重写Equals,因为你要按String来查,所以按你的情况,这个Equals应是这样的:
public override bool Equals(object obj)
{
if (obj is string && (string)text= this._text)
{
return true;
}
return false;
}
回复
zxkid 2006-12-29
另外,你也可以这样试一下
private void addComboBox()
{
DataView dataView = new DataView();
dataView = Agent_DataLayer.DsPositionAndStaff.StaffAndPosition.Copy().DefaultView;
dataView.RowFilter = "MarkId <> 0";
foreach(DataRowView drv in dataView)
{
int strVal = int.Parse(drv["staffId"].ToString());
string strText = drv["ItemFull"].ToString().Trim();
ComboBoxItem newItem = new ComboBoxItem();
newItem.Text = strText; //添加text值
newItem.Value = strVal; //添加value值
if (cmbStaffInfo.Items.Contains(newItem) == false)
cmbStaffInfo.Items.Add(newItem);
}
}
回复
zxkid 2006-12-29
private void addComboBox()
{
DataView dataView = new DataView();
dataView = Agent_DataLayer.DsPositionAndStaff.StaffAndPosition.Copy().DefaultView;
dataView.RowFilter = "MarkId <> 0";
//用个辅助列表变通一下,:)
List<string> ItemTextList = new List<string>();
foreach(DataRowView drv in dataView)
{
int strVal = int.Parse(drv["staffId"].ToString());
string strText = drv["ItemFull"].ToString().Trim();
if (ItemTextList.Contains(strText) == false)
{
ItemTextList.Add(strText);
ComboBoxItem newItem = new ComboBoxItem();
newItem.Text = strText; //添加text值
newItem.Value = strVal; //添加value值
this.cmbStaffInfo.Items.Add(newItem);
}
}
}
回复
lanye_purple 2006-12-29
好像還是不可以,誰幫我看看。。
回复
YYGui 2006-12-29
Items.Contains()方法判断的是Value值吧``
回复
要重写相等方法才能用Contains查出是否已存在相同的项,因为ComboBoxItem是引用类型而不是值类型,参见如下的改正:
public class ComboBoxItem
{
//為ComboBox添加value和text值
private string _text = null;
private object _value = null;
public string Text { get { return this._text; } set { this._text = value; } }
public object Value
{
get { return this._value; }
set { this._value = value; }
}
public override string ToString()
{
return this._text;
}
public override bool Equals(object obj)
{
ComboBoxItem item = obj as ComboBoxItem;
if (item != null)
{
return object.Equals(this._value, item._value);
}
/*或
if (item!=null)
{
return this._text==item._text;
}
*/
return false;
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.