天道酬勤,学无止境

ObjectListView强制转换异常(用于命中测试)(ObjectListView cast exception (for hit testing))

问题

我正在使用Grammarian的ObjectListView。 我将原来的列表视图更改为该列表视图,但是我要做的就是填写项目。 但是,当应用程序启动并且我的鼠标位于列表视图上方时,它立即引发以下异常:

System.InvalidCastException was unhandled
  Message="Unable to cast object of type 'System.Windows.Forms.ListViewItem' to type 'BrightIdeasSoftware.OLVListItem'."
  Source="ObjectListView"

如何解决这个问题?

如果重要的话,我也使用Win7。

编辑:

我用字典。 看来我需要使用SetObjects方法而不是添加项目。

好的,这很好,但是我只是在使用dict.Value集合。 我不想通过listview修改数据,仅显示。 因此,我只有1列,并列出其中的所有字符串。 这可能吗?

我将不胜感激。

回答1

没错-您应该使用SetObjects()方法,而不是添加ListViewItems 。 在ObjectListView中,永远不应有ListViewItems. 该控件跟踪更多信息,因此需要的内容比ListViewItems所提供的更多。

您可能需要阅读网站的“入门”页面,尤其是“必须取消学习”部分。

如果您想在这里问问题,ObjectListView确实有自己的论坛。

回答2

OP的答案:

据我了解,您正在使用值类型为字符串的字典。

在“详细信息”模式下,这向我显示了字典中的值的列表。

        // Create dictionary.. Can be done somewhere else..
        var dictionary = new Dictionary<int, string>();
        dictionary.Add(1, "Item 1");
        dictionary.Add(2, "Item 2");

        // You can set up the column in the designer as well.
        objectListView1.Columns.Add(new OLVColumn(title: "Items", aspect: "Value"));
        // Initially tells OLV to use the dictionary as a datasource.
        objectListView1.SetObjects(dictionary);

        // .....


        // Later on, you can add another item to the dictionary.
        dictionary.Add(3, "Item 3");
        // All you have to do now, is call .BuildList(), and your listview is updated.
        // shouldPreserveState can be false if you want. I want it to be true. :)
        objectListView1.BuildList(shouldPreserveState:true);

这不完全是“一行”,但是如果您确实在设计器中设置了该列,那么SetObjects()实际上就是激活它的那一行。 您只需要记住,只要字典发生更改,便要调用BuildList。


回答@ElektroStudios

好的,出于某种原因,您想使用ListViewItem作为“数据容器”。 正如@Grammarian指出的那样,这不是OLV的预期用法,但是ListViewItem是一个具有属性的类,就像其他任何具有属性的类一样,因此很容易做到。

这不是一个“单线”,但绝对不是一个write a 1000 lines model class... Just to add 1 string to a ListView 。 注意,我指定了两种为列设置吸气剂的方法。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // Items collection.
        // Add your list view items to this.
        // Note the fact that we have a different amount of subitems!!!
        var items = new List<ListViewItem>
        {
            new ListViewItem(new []{"Hello", "Stack","Overflow"}), 
            new ListViewItem(new []{"ObjectListView is pretty damn neat!"}), 
            new ListViewItem(new []{"Pretty", "Cool"})
        };

        // These are set up by the WinForms Designer when I create OLV columns in the designer.

        // Here, I am telling each column to use a custom getter, created by the SubItemGetter method.
        // ensures the sub-items actually exist on each LVI.
        olvColumn1.AspectGetter = SubItemGetter(0); // ListViewItem's first sub-item is the same as ListViewItem.Text. :)
        olvColumn2.AspectGetter = SubItemGetter(1);
        olvColumn3.AspectGetter = SubItemGetter(2);

        // NOTE: I assume you know at design-time how many columns there are in your list view.
        // Set them up as I've done above, or, if you want to be fancy..
        for (int index = 0; index < objectListView1.Columns.Count; index++)
        {
            OLVColumn column = objectListView1.AllColumns[index];
            column.AspectGetter = SubItemGetter(index);
        }

        // Tells OLV to use the items collection.
        objectListView1.SetObjects(items);

        // Sometime later, probably somewhere else in the code...
        items.Add(new ListViewItem(new []{"I","Dont","Care","How","Many","SubItems","There","Is!"}));
        // Tell OLV to rebuild!
        objectListView1.BuildList(shouldPreserveState:true); // I'd like to preserve state, please :)
    }

    private AspectGetterDelegate SubItemGetter(int subItemIndex)
    {
        // This returns a method that gives OLV the string it needs to render each cell,
        // while also making sure the sub item exists.
        return rowObject =>
        {
            // Cast the row object to a ListViewItem. This should be safe.
            var lvi = (ListViewItem) rowObject;
            // Make sure the index is not out of range.
            if (lvi.SubItems.Count <= subItemIndex)
                return null;
            // Return what needs to be displayed!
            return lvi.SubItems[subItemIndex].Text;
        };
    }
}

这给了我这样的默认外观OLV(请注意分组是可配置的!)。

形式..

回答3

关于语法的答案,他们没有告诉你的是这个。

他们告诉您,只需要一行就可以激活它,但是您会发现这很头疼,而且还有很多工作要做,这是值得的。 我强烈建议您坚持使用普通的ListView ,否则您将发现自己编写了1000行的模型类...仅向ListView添加1个字符串。

在您深入研究ObjectListView业务之前,这只是事实。

去下载示例,看看吧,坦白地说,使用普通的ListView会更容易。

回答4

尝试将虚拟模式下的普通ListView传递给OLV 2.7中的ListViewPrinter时遇到类似的错误

The error occurred here:
#if !WITHOUT_OBJECTLISTVIEW
        /// <summary>
        /// Get the nth item from the given listview, which is in virtual mode.
        /// </summary>
        /// <param name="lv">The ListView in virtual mode</param>
        /// <param name="n">index of item to get</param>
        /// <returns>the item</returns>
        override protected ListViewItem GetVirtualItem(ListView lv, int n)
        {
// Invalid Cast happens here
            return ((VirtualObjectListView)lv).MakeListViewItem(n);
        }

它可以像预期的那样与objectlistview一起工作。 除了使用objectlistview之外,没有其他解决方案。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • ObjectListView cast exception (for hit testing)
    I am using Grammarian's ObjectListView. I changed my old listviews to that, but all I do is to fill in items. But when the app starts up and my mouse is over the listview, it immediately throws an exception for: System.InvalidCastException was unhandled Message="Unable to cast object of type 'System.Windows.Forms.ListViewItem' to type 'BrightIdeasSoftware.OLVListItem'." Source="ObjectListView" How to fix this? Also I use Win7 if that's important. EDIT: I use a dictionary. It looks like I need to use the SetObjects method instead of adding items. Ok this is great, but I am just using the dict
  • ObjectListView显示图标(ObjectListView show icons)
    问题 试图在ObjectListview中放置图标,这是我应该在其中放置图标的代码: objectListView1.SmallImageList = imageList1; deleteColumn.IsEditable = true; deleteColumn.ImageGetter = delegate { return 0; }; deleteColumn.AspectGetter = delegate { return "Delete"; }; imageList1已经有一个图像,此代码应该在“删除”旁边放置一个图标,但是它完全没有出现,通过食谱和Google进行查看,我仍然不知道。 谁能帮我? 如果需要,这是完整的表单代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Security.Cryptography; using System.IO; namespace WindowsFormsApplication1 {
  • ObjectListView show icons
    Trying to put icons in ObjectListview, here's my piece of code where icon should have been put: objectListView1.SmallImageList = imageList1; deleteColumn.IsEditable = true; deleteColumn.ImageGetter = delegate { return 0; }; deleteColumn.AspectGetter = delegate { return "Delete"; }; imageList1 already have an image, this code should have put an icon next to "Delete", but it did not appear at all, looked through cookbooks and Google and I still have no idea. Can anyone help me? this is the full form code in case needed: using System; using System.Collections.Generic; using System.ComponentModel
  • How to add a new item into ObjectListView?
    I tried the demo code in demo project but I can't add new item successfully. It just add new new NULL group and NULL item. Please give me an simple example code to add new item (text and image). Thank you! Oh sorry! I forgot it. This is the first time I participate in this site. I use C#. And the code is: objectListView1.BeginUpdate(); objectListView1.AddObject(new string [] {"Hello","dfdsF" }); objectListView1.EndUpdate(); and objectListView1.BeginUpdate(); OLVListItem item = new OLVListItem(new string [] {"Hello","dfdsF" }); objectListView1.Items.Add(item); objectListView1.EndUpdate(); It's
  • 即使将焦点放在另一个控件上,如何更改listview所选行的背景色?(How to change listview selected row backcolor even when focus on another control?)
    问题 我有一个使用条形码扫描仪作为输入设备的程序,这意味着我需要将重点放在文本框上。 该程序具有一个listview控件,当扫描特定条形码时,我将以编程方式选择其中一项。 我通过以下方式设置行的背景色: listviewitem.BackColor = Color.LightSteelBlue; 我尝试过的事情: listview.HideSelection设置为false 设置颜色后调用listview.Focus() listviewitem.Focused设置为true 呼叫listview.Invalidate 呼叫listview.Update() 调用listview.Refresh() 上面的不同组合 我还在计时器中进行了上述组合,因此它们在不同的线程上被调用,但仍然没有成功。 有任何想法吗? 更多信息: 这里的关键是控制焦点。 选择其中一项时, listview控件没有焦点。 我通过执行以下操作选择一项: listView1.Items[index].Selected = true; 焦点始终在文本框中。 该计算机没有键盘或鼠标,只有条形码读取器。 我有以下代码可以将重点放在文本框上: private void txtBarcode_Leave(object sender, EventArgs e) { this.txtBarcode.Focus(); }
  • How to wordWrap the text in a column using ObjectListView
    For example I have a big sentence: "I like to eat pie and have fun around the house all day long!" And I want it to appear like this: "I like to eat pie and have fun around the house all day long!" In this post: Multi-line list items on WinForms ListView control? Grammarian said that you only need to have WordWrap on but I cannot find that option. Thanks for the help in advanced
  • Objectlistview how to change the text in the group header?
    I want to change the name of the group header but i cant find any solutions in the documentation or on google. the text in the header should be a time which is summed up in the group. this is how it should look like:
  • 我怎么可以强制转换为NSManagedObject但不能强制转换为实体的类型?(How come I can cast to NSManagedObject but not to my entity's type?)
    问题 我在一个新项目中将Swift样板代码用于Core Data。 我的.xcdatamodeld文件具有定义的单个实体( Task )和单个属性( name )。 我有一个Task.swift文件,如下所示: import CoreData class Task: NSManagedObject { @NSManaged var name: String } 当我运行它时,它的工作原理是: var firstTask = NSEntityDescription.insertNewObjectForEntityForName("Task", inManagedObjectContext: managedObjectContext) as NSManagedObject firstTask.setPrimitiveValue("File my TPS reports", forKey: "name") var error: NSError? managedObjectContext.save(&error) 我什至可以进入iOS模拟器正在使用的SQLite数据库,并确认已添加该行。 但是,当我运行与上面完全相同的代码,但使用as Task而不是as NSManagedObject ,出现崩溃,并显示错误消息Thread 1: EXC_BREAKPOINT (code=EXC_I386
  • The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects
    I have 2 tables in SQL. One is called Training and one is called Consultants. Training is couple of fields like ID, Place, Time, Date and it also has ConsultantName which is foreign key and is connected with Consultants having ConsultantName, ConsultantFirstName etc. During save of Training i save the training first and then pass the Training value as varTraining. I tried to attatch it to context as per some suggestions I found on stack but it doesn't seem to work: Training Training = context.Trainings.First(p => p.TrainingID == varTraining.TrainingID); context.Trainings.Attach(Training)
  • Filtering ListView with custom (object) adapter
    I'm trying to implement filtering of a ListView which is uses a custom object adapter, but I can't find any useful samples. The included code is very simplified, so no- keep in mind I can't use an regular ArrayAdapter. I have a EditText above the ListView, and when the user enters text in the EditText widget I would like to filter the ListView by the text written in the EditText. Any suggestions would be much appreciated! Here is the snippet from the activity class: public class management_objects extends Activity { private static List<User> UserList; private EfficientAdapter adapter = null
  • 在CLR中投放与使用'as'关键字(Casting vs using the 'as' keyword in the CLR)
    问题 在对接口进行编程时,我发现我正在做大量的转换或对象类型转换。 这两种转换方法之间有区别吗? 如果是这样,是否存在成本差异,或者这对我的计划有何影响? public interface IMyInterface { void AMethod(); } public class MyClass : IMyInterface { public void AMethod() { //Do work } // Other helper methods.... } public class Implementation { IMyInterface _MyObj; MyClass _myCls1; MyClass _myCls2; public Implementation() { _MyObj = new MyClass(); // What is the difference here: _myCls1 = (MyClass)_MyObj; _myCls2 = (_MyObj as MyClass); } } 另外,“一般”是什么首选方法? 回答1 该行下方的答案写于2008年。 C#7引入了模式匹配,它已在很大程度上取代了as运算符,您现在可以编写: if (randomObject is TargetType tt) { // Use tt here } 请注意
  • VisualStyleRenderer和主题(WinForms)(VisualStyleRenderer and themes (WinForms))
    问题 我有自己的TreeView控件,它完全是OwnerDraw'n: myTreeView.DrawMode = TreeViewDrawMode.OwnerDrawAll; 我试图实现的是根据当前资源管理器主题绘制打开/关闭的字形。 尤其是在Vista和Win7盒子上,我希望看到新的字形(黑色三角形)而不是正负号。 我知道,对于非OwnerDraw'n TreeView来说,可以通过如下方式实现,效果很好: myTreeView.HandleCreated += delegate(object sender, EventArgs args) { MyNativeMethods.SetWindowTheme(myTreeView.Handle, "explorer", null); }; 我以为VisualStyleRenderer可以让我绘制字形主题感知: VisualStyleRenderer r = new VisualStyleRenderer(VisualStyleElement.TreeView.Glyph.Opened); r.DrawBackground(e.Graphics, e.Bounds); 不幸的是,以上代码在所有情况下都会绘制负号。 看起来VisualStyleRenderer不支持主题设置。 有人可以阐明这一点吗? 谢谢! 回答1
  • C#as强制转换与经典强制转换(C# “as” cast vs classic cast [duplicate])
    问题 这个问题已经在这里有了答案: 8年前关闭。 可能重复: 在CLR中投放与使用'as'关键字 我最近了解了一种不同的投射方式。 而不是使用 SomeClass someObject = (SomeClass) obj; 可以使用以下语法: SomeClass someObject = obj as SomeClass; 如果obj不是SomeClass,则似乎返回null,而不是引发类强制转换异常。 我看到如果强制转换失败并且我尝试访问someObject变量,则可能导致NullReferenceException。 所以我想知道这种方法的原理是什么? 为什么要使用这种转换方式而不是(旧的)转换方式-似乎只能将失败的“更深层”转换问题转移到代码中。 回答1 使用“经典”方法,如果强制转换失败,则会引发InvalidCastException。 使用as方法,它将导致null ,可以对其进行检查,并避免引发异常。 此外,您只能将as与引用类型一起使用,因此,如果将类型转换为值类型,则仍必须使用“经典”方法。 笔记: as方法只能用于可以分配null值的类型。 该用法仅表示引用类型,但是当.NET 2.0出现时,它引入了可为空的值类型的概念。 由于可以为这些类型分配null值,因此可以与as运算符一起使用。 回答2 空比较远快于抛出和捕获异常。 异常会产生大量开”
  • C ++中的异常真的很慢吗(Are Exceptions in C++ really slow)
    问题 我正在看C ++中的系统错误处理-Andrei Alexandrescu,他声称C ++中的异常非常慢。 对于C ++ 98来说仍然如此吗? 回答1 当今用于例外(Itanium ABI,VC ++ 64位)的主要模型是零成本模型例外。 这样做的想法是,编译器将生成一个边表,该边表将可能引发异常的任何点(程序计数器)映射到处理程序列表,而不是通过设置防护程序并在所有地方明确检查是否存在异常来浪费时间。 引发异常时,将查询此列表以选择合适的处理程序(如果有),并展开堆栈。 与典型的if (error)策略相比: 顾名思义,零成本模型在没有异常发生时是免费的 if发生异常,它的成本约为10倍/ 20倍 然而,成本并不是微不足道的: 边桌通常很冷,因此从内存中获取它要花费很长时间确定正确的处理程序涉及RTTI:要获取的许多RTTI描述符,分散在内存中以及要运行的复杂操作(基本上是每个处理程序的dynamic_cast测试) 因此,大多数缓存未命中,因此与纯CPU代码相比并不容易。 注意:有关更多详细信息,请阅读TR18015报告的第5.4节异常处理(pdf) 因此,是的,异常路径在异常路径上速度较慢,但​​它们通常比显式检查( if策略)更快。 注意:安德烈·亚历山大(Andrei Alexandrescu)似乎对这种“快速”表示质疑。 我个人已经看到事情发生了双向变化
  • java优化nitpick:是否比在铸造前调用instanceof进行检查更快地投射某些东西并让它抛出异常?(java optimization nitpick: is it faster to cast something and let it throw exception than calling instanceof to check before cast?)
    问题 在有人说什么之前,我只是出于好奇而问。 我不打算根据此答案进行任何过早的优化。 我的问题是关于使用反射和投射的速度。 标准的说法是“反射很慢”。 我的问题是到底哪一部分慢,为什么? 特别是在比较某物是否为另一个实例的父对象时。 我非常有信心,仅将一个对象的类与另一个Class对象进行比较就和任何比较一样快,大概只是对已经存储在对象状态中的单例对象进行直接比较。 但是,如果一个班级是另一个班级的父级又该怎么办? 我通常认为instanceof与普通的类检查一样快,但是今天我考虑了一下,为了使instanceof正常工作,似乎必须在“幕后”进行一些反思。 我在网上检查了一下,发现一些地方有人说instanceof很慢; 大概是由于需要比较对象的父对象的反射? 这就引出了下一个问题,那仅是铸造。 如果我将某些内容强制转换为对象,则不会得到ClassCastException 。 但是,如果将对象强制转换为自身的父对象,则不会发生这种情况。 本质上,我在运行时执行强制转换时,是在执行instanceof调用或具有这种效果的逻辑,对吗? 我从未听说过有人暗示过铸造对象可能很慢。 诚然,并非所有强制类型转换都是针对所提供对象的父对象,但是很多强制类型转换都是针对父类。 但是,从来没有人暗示过这可能很慢。 那是什么呢。 instanceof真的不是那么慢吗?
  • UIApplication.sharedApplication()。delegate作为AppDelegate导致EXC_BAD_ACCESS在快速单元测试中使用它(UIApplication.sharedApplication().delegate as AppDelegate causes EXC_BAD_ACCESS using it on swift unit test)
    问题 我试图快速使用单元测试来测试一些实际的应用程序行为。 当我尝试从测试函数将UIApplicationDelegate强制转换为AppDelegate ,出现了EXC_BAD_ACCESS异常。 测试代码下方: func testGetAppDelegate(){ let someDelegate = UIApplication.sharedApplication().delegate let appDelegate = someDelegate as AppDelegate //EXC_BAD_ACCESS here XCTAssertNotNil(appDelegate, "failed to get cast pointer") } AppDelegate类设置为public,因此从访问级别来说这不是问题。 在同一测试目标中使用Objective-C可以正常工作。 下面是简单的说明: AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 调试器说someDelegate是Builtin.RawPointer。 不知道那是什么,我对低级细节不熟悉。 回答1 我认为您已将AppDelegate.swift添加到测试目标成员。 当您这样做时, AppName
  • 按列对ListView排序(Sorting A ListView By Column)
    问题 当前,我在列表视图上使用自定义排序器,并且每次单击FIRST列时都可以对列表视图进行排序,但是不会按其他列进行排序。 SortStyle:用于确定是升序还是降序的变量。 if (e.Column == 0) { if (SortStyle == 0) { List.ListViewItemSorter = customSortDsc; SortStyle = 1; } else { List.ListViewItemSorter = customSortAsc; SortStyle = 0; } } 在对第一列进行排序时,这可以很好地工作,但是如果要在其他任何列上进行排序,则只会按第一列进行排序。 有没有一种方法可以对单击的列进行排序? 回答1 如果您从ListView开始,请帮自己一个忙,使用ObjectListView代替。 ObjectListView是.NET WinForms ListView的开源包装,它使ListView更加易于使用,并为您解决了许多常见问题。 按列单击排序是它自动为您处理的许多事情之一。 认真地说,您永远不会后悔使用ObjectListView而不是普通的ListView。 ObjectListView主页 ObjectListView Nuget软件包 回答2 忘记您的自定义分类器。 重新开始使用以下页面上的代码。
  • 使用自定义(对象)适配器过滤ListView(Filtering ListView with custom (object) adapter)
    问题 我正在尝试对使用自定义对象适配器的ListView进行过滤,但是找不到任何有用的示例。 包含的代码非常简化,因此请记住,我不能使用常规的ArrayAdapter。 我在ListView上方有一个EditText,当用户在EditText小部件中输入文本时,我想用EditText中编写的文本过滤ListView。 我们欢迎所有的建议! 这是活动类的摘录: public class management_objects extends Activity { private static List<User> UserList; private EfficientAdapter adapter = null; private ListView objectListView = null; private EditText SearchText = null; private static class EfficientAdapter extends BaseAdapter implements Filterable{ private LayoutInflater mInflater; public EfficientAdapter(Context context) { mInflater = LayoutInflater.from(context); } public int
  • How to tweak my tooltips in wxpython?
    I was trying to add a tooltip to show the full content of a truncated ObjectListView, until it turned out it had such a feature built-in: I tried making my own tool tips using wx.TipWindow, wx.PopupWindow and SuperToolTip, but none of them looked as 'native' as this one. While I'm aware of this wiki article that supposedly enables the tooltip for truncated wx.Listrctrls, I didn't really understand how to get it working. I also expect that it only works when something is truncated, whereas I'd like to be able to use it to display some more information. I guess the SuperToolTip comes close, but
  • 强制转换:(NewType)与Object作为NewType [重复](Casting: (NewType) vs. Object as NewType [duplicate])
    问题 这个问题已经在这里有了答案: 在CLR中投放与使用'as'关键字进行对比(18个答案) 1年前关闭。 这两个演员之间到底有什么区别? SomeClass sc = (SomeClass)SomeObject; SomeClass sc2 = SomeObject as SomeClass; 通常,它们都不应该都是对指定类型的显式强制转换吗? 回答1 如果源类型不能转换为目标类型,则前者将引发异常。 后者将导致sc2为空引用,但也不例外。 [编辑] 我最初的回答当然是最明显的区别,但是正如埃里克·利珀特(Eric Lippert)指出的那样,这不是唯一的区别。 其他差异包括: 您不能使用'as'运算符强制转换为不接受'null'作为值的类型您不能使用“ as”将数字等事物转换为其他表示形式(例如,从float转换为int)。 最后,使用“ as”与强制转换运算符,您还说“我不确定是否会成功”。 回答2 还要注意,您只能将as关键字与引用类型或可为空的类型一起使用 IE: double d = 5.34; int i = d as int; 不会编译 double d = 5.34; int i = (int)d; 将编译。 回答3 当强制转换失败时,使用“ as”进行类型转换当然要快得多,因为它避免了引发异常的开销。 但是当转换成功时并不会更快。 http://www