【问题标题】:Get value from listview从列表视图中获取价值
【发布时间】:2014-03-02 04:40:04
【问题描述】:

此代码中发生的情况是,当列表视图中的项目数为 3 时,drv 变量为空。 谁能告诉我我做错了什么?

private void btn_save_Click(object sender, RoutedEventArgs e)
{
    DataRowView drv;
    bool valueToCheck;
    List<Common.Rule> lst = new List<Common.Rule>();
    Common.Rule ru = new Common.Rule();
    lst = rr.GetAllRules().ToList();//getting all rules from database
    for (int i = 0; i < ltv_rules.Items.Count; i++)
    {
        drv = ltv_rules.Items.GetItemAt(i) as DataRowView;
        valueToCheck = Convert.ToBoolean(drv["IsSet"]);// to get the value of the combobox isSet from the list view
        ru = lst[i];//getting the value of the isSet before it was binded to the list view.
        if (ru.IsSet != valueToCheck)//comparing the original value (before it was binded) to the value that i get from the listview
        {
            ru.IsSet = valueToCheck;
            bool updated = rr.UpdateRule(ru);
        }
    }
}

【问题讨论】:

  • Can any one tell me what i'm doing wrong please? - 一切。首先,不要使用System.Data.DataTable。这只是一个美化的Dictionary&lt;string,object&gt;,它迫使你进入一堆可怕的演员阵容,Convert.ToMyGranny() 和基于魔术字符串的东西。其次,创建一个适当的数据模型来保存您的数据。第三,如果这是 WPF,创建一个合适的 ViewModel,所有的问题都会神奇地消失。
  • 第四,学习使用var关键字,以免重复自己。第五,学习使用 LINQ,以便在 C# 中完成 99% 的 Collection 相关操作,而不是传统的过程式 for 循环等。
  • @HighCore,我看到你一直在写这篇关于DataTable 类的文章。该类型是快速获取和操作数据的有效且有用的方法,尤其是。使用数据库时。说它是一个“美化的Dictionary&lt;string, object&gt;”当然是不正确的,这是不是真的......要构造一个像DataTable 一样运行的泛型类需要大量的工作。不过,我同意视图模型的说法。
  • @Killercam 是的,我很确定:Convert.ToBoolean(dr["SomeBool"]) 在某种程度上比创建适当的强类型数据模型并执行model.MyBool 而不是使用一堆可怕的magic-string-based 更有效evething 是 object 的东西,你需要不断地投射所有东西。请...如果您需要查询数据库,请使用实体框架,它不再是 1990 年了。
  • @Killercam LINQ To Excel 伙计。醒醒,现在已经不是 1990 年了。 C# 不是 java。

标签: wpf listview datarowview


【解决方案1】:

您正在使用as 进行投射。这对编译器说,'我不确定这个转换,所以如果它无效,则返回 null'。在某些情况下,这是您想要的,但在大多数情况下,您希望在无效转换时抛出异常。在后一种情况下,您使用(SomeType)myValue 进行转换,因此如果转换无效,您将获得InvalidCastException

简而言之,您在线上执行了无效的强制转换:

drv = ltv_rules.Items.GetItemAt(i) as DataRowView;

我希望这会有所帮助。

【讨论】:

  • 当我投射到 DataRowView 时出现问题,因为当我更改此行时“drv = ltv_rules.Items.GetItemAt(i) as DataRowView;”到这个“对象o = ltv_rules.Items.GetItemAt(i);”将返回正确的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 2016-04-14
相关资源
最近更新 更多