【问题标题】:C# - Check datatype of a value via if condtionC# - 在 if 条件下检查值的数据类型
【发布时间】:2010-11-13 01:17:29
【问题描述】:

我将一个 ArrayList() 绑定到一个 Listbox 控件,并为数组中的数据分配一个 Displaymember 和 Value。我的问题是我在启动时绑定但在几次函数调用后数组被填满。我在 selectedIndexChanged 上有代码来检查 selectedValue,但是如果 ArrayList 为空,它会返回一个对象,一旦它有数据,它就会返回我期望的字符串。我仍然很困惑为什么当列表没有数据时它会运行 selectedIndexChanged 。认为它可能会在我绑定 Displaymember 之后但在分配值之前运行:

lbCAT_USER.DataSource = USERS;
// Running here maybe?
lbCAT_USER.DisplayMember = "DisplayString";
// Or Here?
lbCAT_USER.ValueMember = "ID";

无论哪种方式,我当前的工作都是尝试/捕获将 SelectedValue 与字符串进行比较并尝试重新运行该函数。

简单的解决方法可能是在 if 语句之前检查数据类型的一种方法?任何建议的想法都可能非常有帮助。谢谢

【问题讨论】:

    标签: c# listbox events types arraylist


    【解决方案1】:

    您有两种方法可以检查:

    string value = list.SelectedValue as string;
    
    // The cast will return null if selectedvalue was not a string.
    if( value == null ) return; 
    
    //Logic goes here.
    

    如果你只想做比较:

    if( list.SelectedValue is string )
    {
       // ...
    }
    

    【讨论】:

    • +1: 当然这比我的版本可读性好得多——具有讽刺意味的是,我通常用'as'和一个空检查来解决这个问题,但在回答时没有想到这一点:-)
    • 只是另一个说明,因为我不确定他要检查什么类型:使用 'as' 不适用于不可为空的类型
    • 在他的代码下面,他说他目前正在尝试将 SelectedValue 与字符串进行比较,所以这就是我的假设。
    【解决方案2】:

    如果您的问题是如何通过 if-condition(标题!)检查值的数据类型,那么您就去吧(例如:检查值是否属于“字符串”类型):

    if(value.GetType().Equals(typeof(string)))
    {
       ...
    }
    

    编辑:这不是最干净的方法。查看 Guard 的答案以获取更复杂的检查类型的方法。像我一样使用“GetType().Equals”比“is”或“as”更精确,因为“value”必须完全属于“string”类型。即使 'value' 是检查类型的子类,'is' 和 'as' 也会起作用。尽管与“字符串”类型进行比较时,这无关紧要,因为您不能从字符串继承。

    【讨论】:

      【解决方案3】:

      处理值为空的情况:

      if (typeof(value) == typeof(string))
      {
          ...
      }
      

      【讨论】:

      • typeof(...) 在编译时需要一个类型名称。
      • 哎呀,你是对的 - 我的意思是什么,你当然是对的,你是 Jon Skeet! :)
      【解决方案4】:

      相信你也可以使用:

      if (value is string)
      {
      }
      

      在 C# 中检查变量的类型。

      【讨论】:

        【解决方案5】:

        是的,他们都调用 OnSelectedIndexChanged() 事件

        您可以通过在 OnSelectedIndexChanged 处理程序上放置断点并单步执行来检查这一点。

        您可以在进行数据绑定时取消挂钩 OnSelectedIndexChanged 事件

        this.ListBox.SelectedIndexChanged -= OnSelectedIndexChangedHandler;
        
        this.ListBox.DataSource = dataSource;
        this.ListBox.ValueMember = "ID"
        this.ListBox.DisplayMember = "Name"
        
        this.ListBox.SelectedIndexChanged += OnSelectedIndexChangedHandler;
        

        或者只是检查其他人在 OnSelectedIndexChanged 事件中建议的值。

        两者兼而有之

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-24
          • 1970-01-01
          • 2023-02-09
          • 1970-01-01
          • 1970-01-01
          • 2021-08-04
          • 2017-02-05
          • 1970-01-01
          相关资源
          最近更新 更多