在這種情況下,怎麼過濾掉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);
}
}
}
...全文
192 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
其实这个问题重写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#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-12-29 04:46
社区公告

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