none
Изменение входных данных в коллекции WPF RRS feed

  • Вопрос

  • Всем добрый день, подскажите пожалуйста как округлить данные, взятые с коллекции произвести расчет и посчитанные данные перезаписать обратно пример: 

    35340,7 при таком формате я должен получить цифру только 35, при значении 102365,8 должно получиться 102, при 3133072 получается 3133, тоесть мне входное число нужно разделить на  1000

     public class str_pereval
        { public float L      { get; set; }
            public float P      { get; set; }
            public float Pm     { get; set; }
        };
    
     public partial class MainWindow : Window
        {
            public ObservableCollection<str_pereval> List { get; private set; } = new ObservableCollection<str_pereval>();
    
      public MainWindow()
            {    InitializeComponent();
                 CommandBinding_Open_Executed(null, null);
            }
    
     private void CommandBinding_Open_Executed(object sender, ExecutedRoutedEventArgs e)
            {
                List.Clear();
    
    int counter = 0;
                using (var reader = new BinaryReader(File.OpenRead("fpereval.dat")))
                {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        
                        var obj = ReadStruct<str_pereval>(reader);
                        if (counter < 4)
                         List.Add(obj); 
                        else
                            List1.Add(obj);
                            counter++;
    }
       var test = List[1].L / 1000.0;
    
    }

    Данные в коллекцию попадают с файла, и заполняют коллекцию массивом данных после чего отображаются в таблице, 

    и мне нужно по всему массиву произвести деление и отобразить уже посчитанные данные.

    List[0-8].L/1000, как это реализовать ? или надо заносить данные в другую переменную а потом уже эту переменную отображать где нужно ? Извините за глупые вопросы, я только учусь и пока еще не совсем понимаю. Если можно показать примером, всем большое спасибо 

    19 ноября 2015 г. 5:41

Ответы

  • Если я вас правильно понял, то сами данные изменять вам не нужно. Вам нужно только отображать их деленными на 1000. Если так то вам нужно использовать привязку данных в купе с конвертером.

    VB.Net - WPF, UWP

    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:40
    19 ноября 2015 г. 6:58
    Отвечающий
  • В предыдущем вашем вопросе как раз был пример с конвертором. Вам в том пример нужно добавить целочисленное деление L на 1000. Или, если вам нужно округление, то вызывать деление на 1000, а потом Math.Round.
    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:40
    19 ноября 2015 г. 8:24
    Отвечающий
  • Первый вопрос не понял.

    Второй можно вот так:

    float round = 0;
    if (value[0] != null)
    {
        round = Math.Round(((float)value[0]) / 1000);
    }
    result = string.Format("{0}/{1}", round, values[1] ?? "-");

    Третий вопрос. Уберите ; после if в методе.

    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:40
    19 ноября 2015 г. 12:03
    Отвечающий
  • У вас в форматированной строке две ссылки, а параметров 4:

    result = string.Format("{0}/{1}", round,   values[0] ?? "-", round1, values[1] ?? "-");

    Само собой показываются только первые два. Должно быть вот так:

    result = string.Format("{0}/{1}", round, round1);


    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:40
    19 ноября 2015 г. 13:18
    Отвечающий
  • Пожалуйста. Будут вопросы, обращайтесь, постараемся помочь.

    value[0] ?? "-" - это сокрашенная запись вот такого тринарного оператора: value[0] != null ? value[0] : "-" Т.е. если то что слева от ?? не равно null, то возвращается это, а если равно, то то что справа от ??

    P.s. Если какой-то ответ или ответы помогли с решением вашей проблемы, не забудьте их отметить. Для этого под каждым сообщением есть кнопка "Пометить как ответ"

    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:39
    19 ноября 2015 г. 15:36
    Отвечающий

Все ответы

  • Если я вас правильно понял, то сами данные изменять вам не нужно. Вам нужно только отображать их деленными на 1000. Если так то вам нужно использовать привязку данных в купе с конвертером.

    VB.Net - WPF, UWP

    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:40
    19 ноября 2015 г. 6:58
    Отвечающий
  • В предыдущем вашем вопросе как раз был пример с конвертором. Вам в том пример нужно добавить целочисленное деление L на 1000. Или, если вам нужно округление, то вызывать деление на 1000, а потом Math.Round.
    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:40
    19 ноября 2015 г. 8:24
    Отвечающий
  • Спасибо всем за ответ, столкнулся с проблемой что я  не могу обратится к List, тем самым не могу произвести расчет...

    Второй вопрос мне нужно в уже созданный конвертер засунуть решение или нужно создавать новый ? если новый тогда как использовать 2 конвертера в одном столбце ? 

    Третий вопрос перестало работать событие DataGrid_BeginningEdit 

    namespace GridHorizontal
    {
    
       
    
    
        [StructLayout(LayoutKind.Sequential)]
        public class str_pereval
        {
            public int nk { get; set; }
            public int N_vn { get; set; }
            public int N_vv { get; set; }
            public float d_vn { get; set; }
            public float d_vv { get; set; }
            public DateTime t_n { get; set; }
            public DateTime t_k { get; set; }
            public float L { get; set; }
            public float P { get; set; }
            public float Pm { get; set; }
            public float Pp { get; set; }
            public float kal_n { get; set; }
            public float kal_v { get; set; }
            public float res_v { get; set; }
    
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            private float[] frez;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            private int[] irez;
    
            public float[] Frez { get { return frez; } }
            public int[] Irez { get { return irez; } }
        };
    
       
        public partial class MainWindow : Window
            {
                public ObservableCollection<str_pereval> List { get; private set; }
                private SolidColorBrush higlite = new SolidColorBrush(Colors.MistyRose);
                private SolidColorBrush normallite = new SolidColorBrush(Colors.LimeGreen);
    
                public MainWindow()
                {
                    List = new ObservableCollection<str_pereval>();
                    InitializeComponent();
                    DataContext = List;
            
                List.Clear();
                using (var reader = new BinaryReader(File.OpenRead("fpereval.dat")))
                {
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        var obj = ReadStruct<str_pereval>(reader);
                        List.Add(obj);          
                    }
                }
            }
    
                private void CommandBinding_Open_Executed(object sender, ExecutedRoutedEventArgs e)
                {
                    List.Clear();
                    using (var reader = new BinaryReader(File.OpenRead("fpereval.dat")))
                    {
                        while (reader.BaseStream.Position != reader.BaseStream.Length)
                        {
                            var obj = ReadStruct<str_pereval>(reader);
                            List.Add(obj);
                        }
                    }
                }
    
                private void CommandBinding_Save_Executed(object sender, ExecutedRoutedEventArgs e)
                {
                    using (var writer = new BinaryWriter(File.Open("fpereval.dat", FileMode.Create)))
                    {
                        foreach (var obj in List)
                           WriteStruct(writer, obj);
                           writer.Flush();
                    }
                }
    
                private void CommandBinding_Close_Executed(object sender, ExecutedRoutedEventArgs e)
                {
                    Application.Current.Shutdown();
                }
    
                T ReadStruct<T>(BinaryReader reader) where T : class, new()
                {
                    byte[] rawData = reader.ReadBytes(Marshal.SizeOf(typeof(T)));
                    GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
                    var returnObject = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
                    handle.Free();
                    return returnObject;
                }
    
                void WriteStruct<T>(BinaryWriter Writer, T value) where T : class, new()
                {
                    int rawsize = Marshal.SizeOf(typeof(T));
                    IntPtr buffer = Marshal.AllocHGlobal(rawsize);
                    Marshal.StructureToPtr(value, buffer, false);
                    byte[] rawdatas = new byte[rawsize];
                    Marshal.Copy(buffer, rawdatas, 0, rawsize);
                    Marshal.FreeHGlobal(buffer);
                    Writer.Write(rawdatas);
                }
    
            private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
               
            }
    
            private void button_Click(object sender, RoutedEventArgs e)
            {
                var tt = Numbpick.Value;
                label.Content = tt;
            }
    
            private void DataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
            { 
                if (!(new[]{ 3, 4 }).Contains(e.Column.DisplayIndex)); // != 1 & e.Column.DisplayIndex != 4) 
                {
                    e.Cancel = true;
                }
    
            }
        }
    
        class MyConverter : MarkupExtension, IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            {
                 
                var result = "-";
                if (values.Length == 2)
                {
                
                    result = string.Format("{0}/{1}", values[0] ?? "-", values[1] ?? "-");
    
                }
                return result;
            }
    
            public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
    
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                return new MyConverter();
            }
        }
    }
    <Window 
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:GridHorizontal"
            xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" 
            x:Class="GridHorizontal.MainWindow"
            mc:Ignorable="d"
            Title="MainWindow" Height="463.725" Width="921.078">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="25"/>
                <RowDefinition Height="292*"/>
            </Grid.RowDefinitions>
    
    
            <DataGrid x:Name="grMain" ItemsSource="{Binding}" AutoGenerateColumns="False"  
                      SelectionChanged="DataGrid_SelectionChanged" CanUserAddRows="False" 
                      IsReadOnly="False" SelectionMode="Single" Margin="-1,40,1,-1" Grid.Row="1" 
                      BeginningEdit="DataGrid_BeginningEdit">
            <DataGrid.Columns>
                    <DataGridTextColumn Header="Вес(т)/Длина">
                         <DataGridTextColumn.Binding>
                            <MultiBinding Converter="{local:MyConverter}">
                                <Binding Path="P" />
                                 <Binding Path="L" />
                            </MultiBinding>
                         </DataGridTextColumn.Binding>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="UserInitials" Binding="{Binding nk}"/>
                    <DataGridTextColumn Header="EntryDate" Binding="{Binding N_vn, StringFormat=''}" />
                    <DataGridTextColumn Binding="{Binding N_vv}" />
                    <DataGridTextColumn Binding="{Binding d_vn, StringFormat=\{0:F2\}}" />
                    <DataGridTextColumn Binding="{Binding d_vv, StringFormat=\{0:F2\}}" />
                </DataGrid.Columns>
                <DataGrid.LayoutTransform>
                    <TransformGroup>
                        <RotateTransform Angle="90"/>
                        <MatrixTransform Matrix="-1,0,0,1,0,0"/>
                    </TransformGroup>
                </DataGrid.LayoutTransform>
                <DataGrid.ColumnHeaderStyle>
                    <Style TargetType="{x:Type DataGridColumnHeader}"
    					BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
                        <Setter Property="LayoutTransform">
                            <Setter.Value>
                                <TransformGroup>
                                    <RotateTransform Angle="-90"/>
                                    <ScaleTransform ScaleX="1" ScaleY="-1" />
                                </TransformGroup>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.ColumnHeaderStyle>
                <DataGrid.CellStyle>
                    <Style  TargetType="{x:Type DataGridCell}">
                        <Setter Property="LayoutTransform">
                            <Setter.Value>
                                <TransformGroup>
                                    <RotateTransform Angle="-90"/>
                                    <ScaleTransform ScaleX="1" ScaleY="-1" />
                                </TransformGroup>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.CellStyle>
    
            </DataGrid>
            <xctk:DecimalUpDown Name="Numbpick" HorizontalAlignment="Left" Margin="10,10,0,0"  VerticalAlignment="Top" Value="1" Increment="1" Maximum="3" Minimum="1" Grid.RowSpan="2" />
            <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="73,10,0,0" VerticalAlignment="Top" Width="75" Grid.RowSpan="2" RenderTransformOrigin="0.427,0.591" Click="button_Click"/>
            <Label x:Name="label" Content="Label" HorizontalAlignment="Left" Margin="40,12,0,0" Grid.Row="1" VerticalAlignment="Top"/>
        </Grid>
    </Window>


    19 ноября 2015 г. 11:16
  • Извиняюсь чего-то я не понял ...(
    19 ноября 2015 г. 11:18
  • Первый вопрос не понял.

    Второй можно вот так:

    float round = 0;
    if (value[0] != null)
    {
        round = Math.Round(((float)value[0]) / 1000);
    }
    result = string.Format("{0}/{1}", round, values[1] ?? "-");

    Третий вопрос. Уберите ; после if в методе.

    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:40
    19 ноября 2015 г. 12:03
    Отвечающий
  • Большое спасибо за ваш ответ, теперь не могу разобраться как убрать  округлить для первого значения, делаю таким путем: 

     class MyConverter : MarkupExtension, IMultiValueConverter
        {
            public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
            {
                 
                var result = "-";
                double round = 0, round1 = 0;
                if (values[0] != null)
                {
                    round = Math.Round((float)values[0]);
                    round1 = Math.Round(((float)values[1]) / 1000);
                    
                }
                if (values.Length == 2)
                      {
    
                          result = string.Format("{0}/{1}", round,   values[0] ?? "-", round1, values[1] ?? "-");
    
                        }
             
                return result;
            }

    Но тогда получается на выходе: 830/830,2727, тоесть второго Values[1] как будто бы и нет, а должно быть так: 830/35  и т.д., что я в этот раз не так сделал ? раньше округления делал в xaml:

      <DataGridTextColumn Header="Вес(т)" Binding="{Binding P, StringFormat={}{0:0}}" />

    Большое спасибо

    19 ноября 2015 г. 13:02
  • У вас в форматированной строке две ссылки, а параметров 4:

    result = string.Format("{0}/{1}", round,   values[0] ?? "-", round1, values[1] ?? "-");

    Само собой показываются только первые два. Должно быть вот так:

    result = string.Format("{0}/{1}", round, round1);


    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:40
    19 ноября 2015 г. 13:18
    Отвечающий
  • Спасибо вам огромное, все верно, можно вас еще попросить объяснить какую роль играют "??" вопросительные знаки, и  что значат эти знаки "-" ? Еще раз спасибо вам

    19 ноября 2015 г. 15:31
  • Пожалуйста. Будут вопросы, обращайтесь, постараемся помочь.

    value[0] ?? "-" - это сокрашенная запись вот такого тринарного оператора: value[0] != null ? value[0] : "-" Т.е. если то что слева от ?? не равно null, то возвращается это, а если равно, то то что справа от ??

    P.s. Если какой-то ответ или ответы помогли с решением вашей проблемы, не забудьте их отметить. Для этого под каждым сообщением есть кнопка "Пометить как ответ"

    • Помечено в качестве ответа Ethernets 19 ноября 2015 г. 15:39
    19 ноября 2015 г. 15:36
    Отвечающий
  • Спасибо вам огромное многое прояснилось.

    P.s. Ну вы же в прошлый раз сказали не закрывать тему данной кнопочкой, теперь когда вопрос по данной теме закрыт я всем проставлю метки. 

    Еще раз спасибо

    19 ноября 2015 г. 15:39

  • P.s. Ну вы же в прошлый раз сказали не закрывать тему данной кнопочкой, теперь когда вопрос по данной теме закрыт я всем проставлю метки.

    У меня есть несколько заготовок ответов, которые я использую по мере надобности. Например, есть заготовка для "Пожалуйста". Я ее вставил и дописал абзац про value, ну а в заготовке было про "Пометить как ответ" ))
    20 ноября 2015 г. 6:06
    Отвечающий