【问题标题】:Casting a DataGridViewComboBoxColumn item into another object fails将 DataGridViewComboBoxColumn 项转换为另一个对象失败
【发布时间】: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

【问题讨论】:

    标签: c# casting datagridviewcombobox


    【解决方案1】:

    由于成员访问的优先级高于演员 (C# operator precedence),因此以下

    (ComboboxColourItem)Items[i].Index
    

    等价于

    (ComboboxColourItem)(Items[i].Index)
    

    这当然是无效的。

    改用这个

    ((ComboboxColourItem)Items[i]).Index
    

    【讨论】:

    • 太棒了!感谢您的简明解释。
    猜你喜欢
    • 2021-08-14
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2015-09-03
    • 2018-09-20
    • 2021-11-18
    • 1970-01-01
    相关资源
    最近更新 更多