2014-02-05 3 views
0

Что происходит в этом коде, так это то, что переменная drv является пустой, а количество элементов в списке - 3. Может ли кто-нибудь сказать мне, что я делаю неправильно?Получить значение из списка

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); 
     } 
    } 
} 
+0

'Может кто-нибудь сказать мне, что я делаю неправильно, пожалуйста?' - ** Все **. Прежде всего, не используйте 'System.Data.DataTable'. Это просто прославленный «Словарь <строка, объект>», который заставляет вас пугать ужасное кастинг, «Convert.ToMyGranny()» и материал на основе магической струны. Во-вторых, создайте правильную модель данных для хранения ваших данных. В-третьих, если это WPF, создайте правильный ViewModel, и все ваши проблемы будут волшебным образом исчезнуть. –

+0

Прежде всего, научитесь использовать ключевое слово 'var', чтобы не повторять себя. в-пятых, научитесь использовать LINQ для выполнения 99% операций, связанных с Collection, в C#, а не в традиционных процедурных циклах 'for' и т. п. –

+0

@HighCore, я вижу, вы все время пишете об этом классе DataTable. Тип является допустимым и полезным способом быстрого и быстрого доступа к данным, особенно. при работе с базами данных. Серьезно неверно говорить, что это «прославленный» словарь 'this is _not_ true ... Для создания общего класса, который работает как« DataTable », потребуется много работы. Однако я согласен с утверждением модели представления. – MoonKnight

ответ

0

Вы литье, используя as. Это говорит компилятору: «Я не уверен в этом, так что если он недействителен, верните нуль». В некоторых случаях это то, что вы хотите, но в большинстве случаев вы хотите, чтобы исключение было брошено на недействительные трансляции. В последнем случае вы используете (SomeType)myValue, так что если приведение недействительно, вы получите InvalidCastException.

Я Короче говоря, вы выполняете недопустимый бросок на линии:

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

Я надеюсь, что это помогает.

+0

Проблема возникает, когда я передаю DataRowView, потому что когда я меняю эту строку «drv = ltv_rules.Items.GetItemAt (i) как DataRowView;» к этому "объекту o = ltv_rules.Items.GetItemAt (i);" вернет правильный объект. – user3276023

+0

Вот что я сказал выше ... – MoonKnight

+0

Спасибо Killercam :) – user3276023