将 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 项转换为另一个对象失败的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式

sh 一个将生成CA的脚本,将CA导入到钥匙串中,然后它将创建一个证书并与CA签名,然后将其导入到

python怎么将0写入文件?

如何将CMD窗口背景改成透明?