C# WPF обновление прозрачного экрана моих данных
Всем привет. У меня небольшая проблема. Мне нужно обновлять свои данные каждые 5млн с помощью таймера, я вызываю свою функцию GetList (). На моем компьютере у меня есть какие-то проблемы. Мой экран обновляется, ничего не видя. Но на другом компьютере у меня есть "маленькая вспышка" (список исчезает и появляется, но это 1/2 секунды) во время обновления. Я не понимаю почему : мои 2 компьютера-это Windows 10, тот же процессор, та же Оперативная память.
Что еще более странно, на моем компьютере это явление появляется случайным образом каждые 5 или 10 обновлений для одних и тех же данных (одинаковое количество строк SQL). Но, на другом ПК, эта "вспышка"следит за всем обновлением.
Нужно ли мне улучшать свой код ? Как же так ? Почему у меня такое явление ?
Мой код XAML :
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Plutus" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="Plutus.MainWindow" Title="Plutus" Height="523.725" Width="898" WindowStartupLocation="CenterScreen" WindowState="Maximized" Loaded="Window_Loaded" Icon="PlutusIcone.ico"> <Window.Resources> <Style TargetType="ScrollBar"> <Setter Property="Width" Value="35"/> </Style> </Window.Resources> <Grid> <Grid.Background> <ImageBrush ImageSource="Images/FondPlutus.png" Stretch="UniformToFill" /> </Grid.Background> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="0.03*" /> <RowDefinition Height="0.05*" /> <RowDefinition Height="0.05*" /> <RowDefinition Height="0.87*"/> <RowDefinition Height="0.03*" /> </Grid.RowDefinitions> <Rectangle Fill="White" Grid.Column="1" Grid.Row="0" /> <Label Grid.Row="0" Grid.Column="1" Background="White" Content="LISTE" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" FontWeight="Bold"/> <Label Grid.Row="0" Grid.Column="0" Background="WHite" /> <Image Source="Images/UNE.jpg" HorizontalAlignment="Left" Grid.Row="0" Grid.Column="0" /> <Label Grid.Row="0" Grid.Column="3" Background="WHite" /> <Image Source="Images/_H.jpg" HorizontalAlignment="Right" Grid.Row="0" Grid.Column="2" /> <!--<Button Visibility="{Binding strShowMenu}" Name="btnParamsAffichage" Content="Paramètres" HorizontalAlignment="Left" Width="100" Grid.Column="0" Grid.Row="1" Background="#b2c9ef" Click="btnParamsAffichage_Click" />--> <!--<Button Visibility="{Binding strShowMenu}" Name="btnAttribution" Content="Attribution" HorizontalAlignment="Right" Width="100" Grid.Column="1" Grid.Row="1" Background="#b2c9ef" Click="btnAttribution_Click" />--> <Image Visibility="{Binding strShowMenu}" Name="btnParamsAffichage" HorizontalAlignment="Left" Width="100" Grid.Column="0" Grid.Row="2" MouseLeftButtonUp="btnParamsAffichage_Click"> <Image.Style> <Style TargetType="{x:Type Image}"> <Setter Property="Source" Value="Images/ParametresAffichage.png"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Source" Value="Images/ParametresAffichageHover.png"/> </Trigger> </Style.Triggers> </Style> </Image.Style> </Image> <Label FontSize="28" FontWeight="Bold" Grid.Row="2" Content="{Binding strFiltres}" Foreground="White" Margin="100,0, 0,0" VerticalAlignment="Center" /> <Image Name="btnAttribution" HorizontalAlignment="Right" Width="100" Grid.Column="2" Grid.Row="2" MouseLeftButtonUp="btnAttribution_Click"> <Image.Style> <Style TargetType="{x:Type Image}"> <Setter Property="Source" Value="Images/BarCode.png"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Source" Value="Images/BarCodeHover.png"/> </Trigger> </Style.Triggers> </Style> </Image.Style> </Image> <Label FontSize="28" FontWeight="Bold" Foreground="White" Content="{Binding strSelection}" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" /> <ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="3" Grid.ColumnSpan="3"> <ItemsControl VerticalAlignment="Top" x:Name="lvDataBinding" HorizontalContentAlignment="Stretch" BorderThickness="0" Margin="10" Grid.Row="3" Background="{x:Null}" ItemsSource="{Binding LstOperations}" Foreground="White"> <ItemsControl.ItemTemplate> <!--<DataTemplate DataType="{x:Type local:CL_Operation}">--> <DataTemplate> <Border BorderBrush="White" BorderThickness="1" CornerRadius="3" Margin="0,3" Grid.ColumnSpan="0" Background="Transparent" HorizontalAlignment="Left" VerticalAlignment="Top"> <Grid Width="{Binding strWidth}" Height="60" Background="Transparent" Margin="0,1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.05*" /> <ColumnDefinition Width="0.09*" /> <ColumnDefinition Width="0.1*" /> <ColumnDefinition Width="0.12*" /> <ColumnDefinition Width="0.1*" /> <ColumnDefinition Width="0.1*" /> <ColumnDefinition Width="0.1*" /> <ColumnDefinition Width="0.04*" /> <ColumnDefinition Width="0.04*" /> <ColumnDefinition Width="0.04*" /> <ColumnDefinition Width="0.04*" /> <ColumnDefinition Width="0.06*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <UniformGrid Tag="{Binding strRueck}" Background="{Binding scbBackColor}" Grid.Column="0" Grid.Row="0" Grid.RowSpan="4" MouseLeftButtonUp="ClickRowOf" > <UniformGrid.Style> <Style TargetType="{x:Type UniformGrid}"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="False"> <Setter Property="Opacity" Value="1"></Setter> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Opacity" Value="0.8"></Setter> </Trigger> </Style.Triggers> </Style> </UniformGrid.Style> <TextBlock Text="{Binding strPriorite}" FontSize="36" Foreground="Red" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold"/> </UniformGrid> <UniformGrid Grid.Column="0" Grid.Row="4" Grid.RowSpan="2" Background="{Binding scbBackColor}"> <TextBlock Text="{Binding strSsSect}" FontSize="14" Foreground="Black" HorizontalAlignment="Center" VerticalAlignment="Bottom" FontWeight="Bold" /> </UniformGrid> <UniformGrid Grid.Column="1" Grid.Row="0" Grid.RowSpan="6"> <TextBlock Text="{Binding strRetardAvanceText}" FontSize="28" Foreground="{Binding scbColorRetardAvance}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" /> </UniformGrid> <UniformGrid Grid.Column="2" Grid.Row="0" Grid.ColumnSpan="2" Grid.RowSpan="4"> <UniformGrid.Style> <Style TargetType="{x:Type UniformGrid}"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="true"> <Setter Property="Background" Value="Gray"/> </Trigger> </Style.Triggers> </Style> </UniformGrid.Style> <TextBlock Tag="{Binding strRueck}" Foreground="{Binding scbColorNumOfOp}" Text="{Binding strNoOfOp}" FontSize="26" FontWeight="Bold" MouseLeftButtonUp="ClickNoOfOp"/> </UniformGrid> <UniformGrid Grid.Column="2" Grid.Row="4" Grid.RowSpan="2" Grid.ColumnSpan="3"> <TextBlock Text="{Binding strDescriptionOp}" FontSize="14" Foreground="White"/> </UniformGrid> <UniformGrid Grid.Column="4" Grid.Row="0" Grid.RowSpan="2"> <TextBlock Text="{Binding strNoArticle}" FontSize="14" Foreground="White" FontWeight="Bold"/> </UniformGrid> <UniformGrid Grid.Column="4" Grid.Row="2" Grid.RowSpan="2"> <TextBlock Text="{Binding strDateFormatee}" FontSize="14" Foreground="White" FontWeight="Bold"/> </UniformGrid> <UniformGrid Grid.Column="5" Grid.Row="0" Grid.RowSpan="2"> <TextBlock Text="{Binding strPcesPoste}" FontSize="14" Foreground="White"/> </UniformGrid> <UniformGrid Grid.Column="5" Grid.Row="2" Grid.RowSpan="2"> <TextBlock Text="{Binding strTpsPoste}" FontSize="14" Foreground="White"/> </UniformGrid> <UniformGrid Grid.Column="6" Grid.Row="0" Grid.RowSpan="2"> <TextBlock Text="{Binding strTempsPoste}" FontSize="14" Foreground="White"/> </UniformGrid> <UniformGrid Grid.Column="6" Grid.Row="2" Grid.RowSpan="2"> <TextBlock Text="{Binding strClient}" FontSize="14" Foreground="White"/> </UniformGrid> <UniformGrid Grid.Column="5" Grid.Row="4" Grid.RowSpan="2" Grid.ColumnSpan="3"> <TextBlock Text="{Binding strTypeOp}" FontSize="14" Foreground="White"/> </UniformGrid> <UniformGrid Grid.Column="9" Grid.Row="4" Grid.RowSpan="2"> <TextBlock Text="{Binding strAuart}" FontSize="12" Foreground="White" FontWeight="Bold"/> </UniformGrid> <UniformGrid Grid.Column="7" Grid.Row="0" Grid.RowSpan="4"> <Image ToolTip="{Binding strDesBlocage}" Source="{Binding strImageToDisplay}" Visibility="{Binding strWorkingVisibility}"> <Image.Style> <Style TargetType="Image"> <Style.Triggers> <Trigger Property ="IsMouseOver" Value="True"> </Trigger> </Style.Triggers> </Style> </Image.Style> </Image> </UniformGrid> <UniformGrid Grid.Column="8" Grid.Row="0" Grid.RowSpan="4" > <Image Tag="{Binding strRueck}" ToolTip="{Binding strEmpAssigned}" Visibility="{Binding strAttributionVisibility}" MouseLeftButtonUp="ClickAttribution"> <Image.Style> <Style TargetType="{x:Type Image}"> <Setter Property="Source" Value="Images/Attribution.png"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Source" Value="Images/AttributionHover.png"/> </Trigger> </Style.Triggers> </Style> </Image.Style> </Image> </UniformGrid> <UniformGrid Grid.Column="9" Grid.Row="0" Grid.RowSpan="4" > <Image Tag="{Binding strRueck}" ToolTip="{Binding strPostePrevCount}" Visibility="{Binding strRegroupementVisibility}" MouseLeftButtonUp="ClickRegroupement"> <Image.Style> <Style TargetType="{x:Type Image}"> <Setter Property="Source" Value="Images/Regroupement.png"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Source" Value="Images/Regroupement.png"/> </Trigger> </Style.Triggers> </Style> </Image.Style> </Image> </UniformGrid> <UniformGrid Tag="{Binding strRueck}" Grid.Column="11" Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Left" MouseLeftButtonUp="OpenPlan"> <Image Source="Images/Plan.png" Visibility="Visible" /> <UniformGrid.Style> <Style TargetType="{x:Type UniformGrid}"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="true"> <Setter Property="Background" Value="Gray"/> </Trigger> <Trigger Property="IsMouseOver" Value="false"> <Setter Property="Background" Value="Transparent"/> </Trigger> </Style.Triggers> </Style> </UniformGrid.Style> </UniformGrid> <UniformGrid Tag="{Binding strRueck}" Grid.Column="11" Grid.Row="3" Grid.RowSpan="3" HorizontalAlignment="Left" MouseLeftButtonUp="OpenIT"> <Image Source="Images/IT.png" Visibility="Visible" /> <UniformGrid.Style> <Style TargetType="{x:Type UniformGrid}"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="true"> <Setter Property="Background" Value="Gray"/> </Trigger> <Trigger Property="IsMouseOver" Value="false"> <Setter Property="Background" Value="Transparent"/> </Trigger> </Style.Triggers> </Style> </UniformGrid.Style> </UniformGrid> </Grid> </Border> </DataTemplate> </ItemsControl.ItemTemplate> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <UniformGrid Columns="2"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl> </ScrollViewer> <Label HorizontalAlignment="Right" FontSize="14" Foreground="White" Grid.Row="4" Grid.Column="2" Content="{Binding strTotaux}"></Label> </Grid> </Window>
Мой код C# :
public partial class MainWindow : Window, INotifyPropertyChanged { #region Évenement qui permet de déclencher l'événement INotifyPropertyChanged et mettre à jour le binding public void Set<TValue>(ref TValue field, TValue newValue, [CallerMemberName] string propertyName = "") { if (EqualityComparer<TValue>.Default.Equals(field, default(TValue)) || !field.Equals(newValue)) { field = newValue; if (PropertyChanged != null) PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged; #endregion public static RangeObservableCollection<CL_Operation> _lstOperations = new RangeObservableCollection<CL_Operation>(); public static RangeObservableCollection<CL_Operation> LstOperations { get { return _lstOperations; } set { _lstOperations = value; } } private string _strTotaux; public string strTotaux { get { return _strTotaux; } set { Set(ref _strTotaux, value); } } private string _strShowMenu; public string strShowMenu { get { return _strShowMenu; } set { Set(ref _strShowMenu, value); } } private string _strSelection; public string strSelection { get { return _strSelection; } set { Set(ref _strSelection, value); } } private string _strFiltres; public string strFiltres { get { return _strFiltres; } set { Set(ref _strFiltres, value); } } public MainWindow() { InitializeComponent(); DataContext = this; } public void GetList() { strShowMenu = "Hidden"; RangeObservableCollection<CL_Operation> _lstOperationsTemp = new RangeObservableCollection<CL_Operation>(); strSelection = ""; foreach (var item in Var.lstSelectedLignesChoisi) { strSelection += item.ToString() + " "; } foreach (var item in Var.lstSelectedIlotsChoisi) { strSelection += " " + item.ToString() + " "; } foreach (var item in Var.lstSelectedPostesTravailChoisi) { strSelection += " " + item.ToString() + " "; } strFiltres = ""; foreach (var item in Var.lstSelectedOperations) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedTypesDiamant) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedClient) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedMatricule) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedTypeOrdre) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedPriorites) { strFiltres += item.ToString() + " "; } if (!string.IsNullOrEmpty(Var.strFiltreNoOF)) strFiltres += Var.strFiltreNoOF; if (!string.IsNullOrEmpty(Var.strFiltreArticle)) strFiltres += Var.strFiltreArticle; if (!string.IsNullOrEmpty(Var.strFiltreComposant)) strFiltres += Var.strFiltreComposant; if (!string.IsNullOrEmpty(Var.strFiltreAgentOrdo)) strFiltres += Var.strFiltreAgentOrdo; if (!string.IsNullOrEmpty(Var.strFiltreGestMRP)) strFiltres += Var.strFiltreGestMRP; if (!string.IsNullOrEmpty(Var.strFiltreSquelette) && Var.strFiltreSquelette != "TOUS") strFiltres += Var.strFiltreSquelette + " SQUELETTE"; strWhere = ""; strWhere = Where(Var.lstSelectedLignesChoisi, Var.lstSelectedIlotsChoisi, Var.lstSelectedPostesTravailChoisi, Var.lstSelectedOperations, Var.lstSelectedTypesDiamant, Var.lstSelectedClient, Var.lstSelectedMatricule, Var.lstSelectedTypeOrdre, Var.strFiltreArticle, Var.strFiltreNoOF, Var.strFiltreComposant, Var.strFiltreAgentOrdo, Var.strFiltreGestMRP, Var.lstSelectedPriorites, Var.strFiltreSquelette); CreateOrderBy(); dvOps = dtOps.DefaultView; Application.Current.Dispatcher.Invoke(new Action(() => _lstOperationsTemp.Clear())); dtOps.Clear(); string strQueryDatas; SqlConnection con = new SqlConnection(connectionString); strQueryDatas = "SELECT * FROM [DB].[dbo].[View_] " + strWhere + " " + strOrderBy; SqlDataAdapter adOps = new SqlDataAdapter(strQueryDatas, con); adOps.Dispose(); try { con.Open(); SqlCommand sqlCmd = new SqlCommand(strQueryDatas, con); sqlCmd.CommandTimeout = 500; adOps.SelectCommand = sqlCmd; adOps.Fill(dtOps); adOps.Dispose(); sqlCmd.Dispose(); con.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } DateTime dtNow = DateTime.Now; double dblTotalQte = 0; double dblTotalOp = 0; double dblTotalTemps = 0; double dblTotalJoursRetard = 0; for (int i = 0; i < dvOps.Count; i++) { clOp = new CL_Operation(); clOp.strWidth = Convert.ToString(Convert.ToInt32(System.Windows.SystemParameters.PrimaryScreenWidth) / 2); if (dvOps[i]["OP_IsWorking"].ToString().Trim() != "") clOp.bIsWorking = Convert.ToBoolean(dvOps[i]["OP_IsWorking"].ToString().Trim()); else clOp.bIsWorking = false; clOp.bAnoOp = Convert.ToBoolean(dvOps[i]["AnoOP"].ToString().Trim()); if (clOp.bIsWorking && clOp.bAnoOp) { clOp.strImageToDisplay = "Images/TravailAnomalie.png"; clOp.strWorkingVisibility = "Visible"; } else if (clOp.bAnoOp) { clOp.strImageToDisplay = "Images/Anomalie.png"; clOp.strWorkingVisibility = "Visible"; } else if (clOp.bIsWorking) { clOp.strImageToDisplay = "Images/Travail.png"; clOp.strWorkingVisibility = "Visible"; } else { clOp.strImageToDisplay = "Images/Travail.png"; clOp.strWorkingVisibility = "Hidden"; } if (dvOps[i]["OP_IsAssigned"].ToString().Trim() != "") clOp.bIsAssigned = Convert.ToBoolean(dvOps[i]["OP_IsAssigned"].ToString().Trim()); else clOp.bIsAssigned = false; if (clOp.bIsAssigned) clOp.strAttributionVisibility = "Visible"; else clOp.strAttributionVisibility = "Hidden"; clOp.strDesBlocage = dvOps[i]["DesBlocage"].ToString().Trim(); if(!string.IsNullOrEmpty(dvOps[i]["MATRICULE"].ToString().Trim())) clOp.strMatriculeAssigned = Convert.ToInt32(dvOps[i]["MATRICULE"]).ToString().Trim(); clOp.strNameAssigned = dvOps[i]["NAME"].ToString().Trim(); clOp.strFirstNameAssigned = dvOps[i]["FIRSTNAME"].ToString().Trim(); clOp.strEmpAssigned = dvOps[i]["NAME"].ToString().Trim() + " " + dvOps[i]["FIRSTNAME"].ToString().Trim(); clOp.strNoOf = dvOps[i]["NumOF"].ToString().Trim(); clOp.strNoOfOp = dvOps[i]["NumOF"].ToString().Trim() + " - " + dvOps[i]["NumOP"].ToString().Trim(); clOp.strAuart = dvOps[i]["AUART"].ToString().Trim(); clOp.strMaufnr = dvOps[i]["MAUFNR"].ToString().Trim(); clOp.strCodeLigne = dvOps[i]["CodeLigne"].ToString().Trim(); clOp.strRueck = dvOps[i]["RUECK"].ToString().Trim(); clOp.strDescriptionOp = dvOps[i]["DesOpe"].ToString().Trim(); clOp.strNoArticle = dvOps[i]["NumArt"].ToString().Trim(); clOp.strDateFormatee = dvOps[i]["DateFormatee"].ToString().Trim(); clOp.strPcesPoste = Convert.ToString(Convert.ToDouble(String.Format("{0:0}", dvOps[i]["QtePoste"].ToString().Trim()))) + " pces"; clOp.strTpsPoste = Convert.ToString(Convert.ToDouble(String.Format("{0:0.00}", dvOps[i]["TpsChargePoste"].ToString()))) + " Hrs"; clOp.strClient = dvOps[i]["NomClientCourt"].ToString().Trim(); clOp.strTypeOp = dvOps[i]["MAKTX"].ToString().Trim(); clOp.strPriorite = dvOps[i]["PriorOF"].ToString().Trim(); clOp.strSsSect = dvOps[i]["SsSect"].ToString().Trim(); clOp.strDateDerBadge = Convert.ToDateTime(dvOps[i]["DatDerBadg"]); clOp.strWorkStart = dvOps[i]["DATETIMEDEBUT"].ToString().Trim(); clOp.strNumOp = dvOps[i]["NumOpSt"].ToString().Trim(); clOp.strIDRegroupement = dvOps[i]["USR02"].ToString().Trim(); clOp.strFlagPostePrev = dvOps[i]["FlagPostePrev"].ToString().Trim(); clOp.strNumArtPere = dvOps[i]["NumArtPere"].ToString().Trim(); clOp.strMAKTXPere = dvOps[i]["MAKTXPere"].ToString().Trim(); //int iCountRegr = 0; if (!string.IsNullOrEmpty(clOp.strIDRegroupement)) { //string strQueryDatas2; //SqlConnection con2 = new SqlConnection(connectionString); SqlConnection con3 = new SqlConnection(connectionString); SqlConnection con4 = new SqlConnection(connectionString); //strQueryDatas2 = "SELECT COUNT (*) FROM [db].[dbo].[view] WHERE USR02 = '" + clOp.strIDRegroupement + "'"; //try //{ // con2.Open(); // SqlCommand sqlCmd = new SqlCommand(strQueryDatas2, con2); // iCountRegr = (Int32)sqlCmd.ExecuteScalar(); // //sqlCmd.CommandTimeout = 500; // con2.Close(); //} //catch (Exception ex) //{ // MessageBox.Show(ex.Message); //} string strQueryDatas3; strQueryDatas3 = "SELECT COUNT (*) FROM [db].[dbo].[Table] WHERE FlagPostePrev = 'POSTE' AND USR02 = '" + clOp.strIDRegroupement + "'"; try { con3.Open(); SqlCommand sqlCmd = new SqlCommand(strQueryDatas3, con3); clOp.iCountRegrPoste = (Int32)sqlCmd.ExecuteScalar(); //sqlCmd.CommandTimeout = 500; con3.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } string strQueryDatas4; strQueryDatas4 = "SELECT COUNT (*) FROM [db].[dbo].[Table] WHERE FlagPostePrev = 'PREV' AND USR02 = '" + clOp.strIDRegroupement + "'"; try { con4.Open(); SqlCommand sqlCmd = new SqlCommand(strQueryDatas4, con4); clOp.iCountRegrPrev = (Int32)sqlCmd.ExecuteScalar(); //sqlCmd.CommandTimeout = 500; con4.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } clOp.strPostePrevCount = "Poste : " + clOp.iCountRegrPoste.ToString() + " / Prév : " + clOp.iCountRegrPrev.ToString(); } if (string.IsNullOrEmpty(clOp.strIDRegroupement)) clOp.strRegroupementVisibility = "Hidden"; else clOp.strRegroupementVisibility = "Visible"; Application.Current.Dispatcher.Invoke(new Action(() => _lstOperationsTemp.Add(clOp))); DateTime dtRetard = Convert.ToDateTime(clOp.strDateFormatee); DateTime dtTempsPoste = Convert.ToDateTime(clOp.strDateDerBadge); TimeSpan tRetard = dtNow.Date - dtRetard.Date; if (dtTempsPoste.ToString() == "01.01.1900 00:00:00") dtTempsPoste = dtNow; TimeSpan tTempsPoste = dtNow - dtTempsPoste; dblTotalQte += Convert.ToDouble(dvOps[i]["QtePoste"].ToString().Trim()); dblTotalTemps += Convert.ToDouble(dvOps[i]["TpsChargePoste"].ToString().Trim()); dblTotalOp++; clOp.strRetardAvanceText = Convert.ToString(Math.Abs(Convert.ToDouble(tRetard.TotalDays))) + " jrs"; clOp.scbBackColor.Freeze(); clOp.scbColorRetardAvance.Freeze(); } strTotaux = "Total retard : " + dblTotalJoursRetard.ToString() + " Jours Nb OPs : " + dblTotalOp.ToString() + " Qte totale : " + dblTotalQte.ToString() + " Pces Temps total : " + dblTotalTemps + " Hrs"; Application.Current.Dispatcher.Invoke(new Action(() => LstOperations.Clear())); Application.Current.Dispatcher.Invoke(new Action(() => LstOperations.AddRange(_lstOperationsTemp))); Var.lstSelectedOperations.Clear(); Var.lstSelectedTypesDiamant.Clear(); Var.lstSelectedClient.Clear(); Var.lstSelectedMatricule.Clear(); Var.lstSelectedTypeOrdre.Clear(); Var.strFiltreNoOF = ""; Var.strFiltreArticle = ""; Var.strFiltreComposant = ""; Var.strFiltreAgentOrdo = ""; Var.strFiltreGestMRP = ""; Var.strFiltreSquelette = ""; strShowMenu = "Visible"; } }
Что я уже пробовал:
Я понял это с помощью этого кода :
strSelection = ""; foreach (var item in Var.lstSelectedLignesChoisi) { strSelection += item.ToString() + " "; } foreach (var item in Var.lstSelectedIlotsChoisi) { strSelection += " " + item.ToString() + " "; } foreach (var item in Var.lstSelectedPostesTravailChoisi) { strSelection += " " + item.ToString() + " "; } strFiltres = ""; foreach (var item in Var.lstSelectedOperations) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedTypesDiamant) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedClient) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedMatricule) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedTypeOrdre) { strFiltres += item.ToString() + " "; } foreach (var item in Var.lstSelectedPriorites) { strFiltres += item.ToString() + " "; } if (!string.IsNullOrEmpty(Var.strFiltreNoOF)) strFiltres += Var.strFiltreNoOF; if (!string.IsNullOrEmpty(Var.strFiltreArticle)) strFiltres += Var.strFiltreArticle; if (!string.IsNullOrEmpty(Var.strFiltreComposant)) strFiltres += Var.strFiltreComposant; if (!string.IsNullOrEmpty(Var.strFiltreAgentOrdo)) strFiltres += Var.strFiltreAgentOrdo; if (!string.IsNullOrEmpty(Var.strFiltreGestMRP)) strFiltres += Var.strFiltreGestMRP; if (!string.IsNullOrEmpty(Var.strFiltreSquelette) && Var.strFiltreSquelette != "TOUS") strFiltres += Var.strFiltreSquelette + " SQUELETTE";
Я изменяю свою привязку ко всем foreach, возможно, это и есть причина моей проблемы.
Я стараюсь :
string strFiltresTemp = ""; string strSelectionTemp = ""; foreach (var item in Var.lstSelectedLignesChoisi) { strSelectionTemp += item.ToString() + " "; } foreach (var item in Var.lstSelectedIlotsChoisi) { strSelectionTemp += " " + item.ToString() + " "; } foreach (var item in Var.lstSelectedPostesTravailChoisi) { strSelectionTemp += " " + item.ToString() + " "; } foreach (var item in Var.lstSelectedOperations) { strFiltresTemp += item.ToString() + " "; } foreach (var item in Var.lstSelectedTypesDiamant) { strFiltresTemp += item.ToString() + " "; } foreach (var item in Var.lstSelectedClient) { strFiltresTemp += item.ToString() + " "; } foreach (var item in Var.lstSelectedMatricule) { strFiltresTemp += item.ToString() + " "; } foreach (var item in Var.lstSelectedTypeOrdre) { strFiltresTemp += item.ToString() + " "; } foreach (var item in Var.lstSelectedPriorites) { strFiltresTemp += item.ToString() + " "; } if (!string.IsNullOrEmpty(Var.strFiltreNoOF)) strFiltresTemp += Var.strFiltreNoOF; if (!string.IsNullOrEmpty(Var.strFiltreArticle)) strFiltresTemp += Var.strFiltreArticle; if (!string.IsNullOrEmpty(Var.strFiltreComposant)) strFiltresTemp += Var.strFiltreComposant; if (!string.IsNullOrEmpty(Var.strFiltreAgentOrdo)) strFiltresTemp += Var.strFiltreAgentOrdo; if (!string.IsNullOrEmpty(Var.strFiltreGestMRP)) strFiltresTemp += Var.strFiltreGestMRP; if (!string.IsNullOrEmpty(Var.strFiltreSquelette) && Var.strFiltreSquelette != "TOUS") strFiltresTemp += Var.strFiltreSquelette + " SQUELETTE";
И в конце моего кода только я обновляю свою привязку :
Application.Current.Dispatcher.Invoke(new Action(() => LstOperations.Clear())); Application.Current.Dispatcher.Invoke(new Action(() => LstOperations.AddRange(_lstOperationsTemp))); strSelection = strSelectionTemp; strFiltres = strFiltresTemp; strTotaux = "Total retard : " + dblTotalJoursRetard.ToString() + " Jours Nb OPs : " + dblTotalOp.ToString() + " Qte totale : " + dblTotalQte.ToString() + " Pces Temps total : " + dblTotalTemps + " Hrs";
К сожалению, проблема та же. На моем компьютере никаких проблем. На другом компьютере я вижу, что список исчезает и появляется. Даже если эта вспышка происходит очень быстро, мне нужно скрыть этот симптом.
Как это сделать ? Я не вижу другого места в своем коде, где я изменяю свою привязку.
Как вы можете видеть в верхней части моей функции GetList, я поставил кнопку ShowMenu в скрытое положение, а затем снова поставил ее в видимое в конце.
Я заметил, что список не исчезает, когда я вижу, что кнопка исчезает, но список исчезает, а затем снова появляется очень быстро, только когда снова появляется кнопка.
Если я не сделаю ясно из моего списка приложений.Текущий.Диспетчер.Invoke (new Action (() => LstOperations.Clear ())); это поведение больше не вмешивается ни на одном компьютере, поэтому оно работает так, как я хочу. Но, конечно, мой список накапливается, а не рушится.
Как это сделать ? Должен ли я рассчитать дельту, чтобы быть полностью прозрачным ??
На .понятно и .К сожалению, AddRange временного списка, по-видимому, недостаточно быстр.
На моем ПК: когда я запрашиваю данные, список виден, когда он выполняет мою функцию getlist, я даже могу взаимодействовать с приложением, а затем я ничего не могу сделать с приложением в течение того времени, когда оно обновляет привязку, когда оно завершает восстановление данных.
Вот чего я хочу.
На другом компьютере: он исчезает, а затем снова появляется список.
На моем компьютере я могу взять 3000 строк, никакого исчезновения / повторного появления списка
на другом ПК: я беру 1 строку и такое поведение есть.
Заранее благодарю вас, большое вам спасибо.
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]