将 DataGridViewComboBoxColumn 项转换为另一个对象失败
Posted
技术标签:
【中文标题】将 DataGridViewComboBoxColumn 项转换为另一个对象失败【英文标题】:Casting a DataGridViewComboBoxColumn item into another object fails 【发布时间】:2016-06-12 15:08:37 【问题描述】:这个方法是我从DataGridViewComboBoxColumn
派生的类的一部分:
public ComboboxColourItem InsertColour(ushort iColourIndex)
ComboboxColourItem ocbItem = ComboboxColourItem.Create(iColourIndex);
bool bAppend = true;
if (Items.Count > 15)
// There are other colours, need to find right index
for(int i = 15; i < Items.Count; i++)
//if(ocbItem.Index < (ComboboxColourItem)Items[i].Index)
//
//
ComboboxColourItem ocbItem2 = (ComboboxColourItem)Items[i];
if (ocbItem.Index < ocbItem2.Index)
bAppend = false;
Items.Insert(i, ocbItem);
break;
if (bAppend)
Items.Add(ocbItem);
return ocbItem;
Items
包含 ComboboxColourItem
对象。以下是这些项目的定义:
public class ComboboxColourItem
public string Name get; set;
public ushort Index get; set;
public Color Value get; set;
public ComboboxColourItem(string Name, ushort Index, Color Value)
this.Name = Name;
this.Index = Index;
this.Value = Value;
public override string ToString()
return Name;
static public ComboboxColourItem Create(ushort iColourIndex)
OdCmColor oColour = new OdCmColor();
oColour.setColorIndex(iColourIndex);
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
String strColour = textInfo.ToTitleCase(oColour.colorNameForDisplay());
if (iColourIndex < 8)
strColour = String.Format("0 (1)", strColour, iColourIndex);
else if (iColourIndex == 8 || iColourIndex == 9 || iColourIndex >= 250)
strColour = String.Format("Grey Shade (0)", iColourIndex);
else
strColour = String.Format("Other (0)", iColourIndex);
ComboboxColourItem oColourItem = new ComboboxColourItem(
strColour,
iColourIndex,
Color.FromArgb(oColour.red(), oColour.green(), oColour.blue()));
oColour.Dispose();
return oColourItem;
我知道我可以使用foreach(ComboboxColourItem ocbItem2 in Items)
,但我需要从某个索引开始。所以我决定使用常规的for
循环。
我认为我可以这样做以从object
投射项目:
if(ocbItem.Index < (ComboboxColourItem)Items[i].Index)
不喜欢这个演员。然而,如果我这样做:
ComboboxColourItem ocbItem2 = (ComboboxColourItem)Items[i];
if (ocbItem.Index < ocbItem2.Index)
效果很好。那为什么我不能投呢?我做错了吗?我认为在这种情况下我不能使用foreach
。
【问题讨论】:
【参考方案1】:由于成员访问的优先级高于演员 (C# operator precedence),因此以下
(ComboboxColourItem)Items[i].Index
等价于
(ComboboxColourItem)(Items[i].Index)
这当然是无效的。
改用这个
((ComboboxColourItem)Items[i]).Index
【讨论】:
太棒了!感谢您的简明解释。以上是关于将 DataGridViewComboBoxColumn 项转换为另一个对象失败的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等