【问题标题】:reloading a WPF Datagrid重新加载 WPF 数据网格
【发布时间】:2017-02-02 17:08:22
【问题描述】:

我在加载数据网格时遇到问题。实际上,我通过填充一个数据表来显示一个数据网格,该数据表填充了从 SQL DB 获取的值,其中包含 3 个带有复选框的额外列。当用户单击一个复选框时,必须启用下一个复选框并在 DB 中进行更新。为了实现这一点,我确实喜欢这样做。当用户单击一个复选框时,它将更新第一个任务已完成的数据表,因此下次读取数据库时,它会通过先禁用来启用下一个。我做了所有事情,但对清除早期的 datgrid 并显示更新的数据感到震惊。数据库正在更新,甚至在 itemsource 中,我也在更新更新的数据库。但它仍然显示上一个。

我的 DATAGRID 的 XAML 代码:

<DataGrid Name="DG_FollowUp" ItemsSource="{Binding dt}" AutoGenerateColumns="False" SelectionMode="Single" SelectedIndex="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" Grid.Row="01" BorderBrush="Black" BorderThickness="0.5" LoadingRow="DG_FollowUp_LoadingRow" IsEnabled="True" IsReadOnly="True" AlternationCount="2" ><!--VirtualizingStackPanel.IsVirtualizing="True"-->
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding EntryID}" Header="Entry ID" Width="75">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="HorizontalAlignment" Value='Center'/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding [TicketID/Subject]}" Header="TicketID/Subject" Width="300" CanUserSort="False"/>
                    <DataGridTextColumn Binding="{Binding [AddDate]}" Header="Start Date" Width="90" CanUserSort="False"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding [Status]}" Header="Status" Width="80" CanUserSort="False"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding [OwnerShip]}" Header="Ownership" Width="130" CanUserSort="False"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding [Comments]}" Header="Comments" Width="300" CanUserSort="False"></DataGridTextColumn>
                    <DataGridTextColumn Binding="{Binding [SLA DATE]}" Header="SLA Date" Width="90" CanUserSort="False"></DataGridTextColumn>                        
                    <DataGridTemplateColumn Header="Strike1" Width="65">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Click="CHK_Strike1_Click" IsChecked="{Binding Checked}" Name="CHK_Strike1" HorizontalAlignment="Center"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Strike2" Width="65">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Click="CHK_Strike2_Click" IsChecked="{Binding Checked}" Name="CHK_Strike2" HorizontalAlignment="Center"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Strike3" Width="65">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Click="CHK_Strike3_Click" Name="CHK_Strike3" IsChecked="{Binding Checked}"  HorizontalAlignment="Center"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTemplateColumn Header="Close Tckt" Width="95">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Click="Chk_CloseTckt_Click" Name="Chk_CloseTckt" IsChecked="{Binding Checked}"  HorizontalAlignment="Center" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>                

向 DataGrid 显示更新的数据库的代码:

using (SqlConnection con = new SqlConnection(UserIDDataTableConnString))
            {
                SqlCommand cmd = new SqlCommand("select * from TBL_TicketMngr where Status = 'Follow Up';", con);
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable("TBL_TicketMngr");
                sda.Fill(dt);
                ////DG_FollowUp.Items.Clear();
                ////DG_FollowUp.ItemsSource = null;

                //DG_FollowUp.ItemsSource = dt.DefaultView;
                ////DG_FollowUp.Items.Refresh();
                DG_FollowUp.DataContext = dt.DefaultView;
                DG_FollowUp.ItemsSource = null;

                //DG_FollowUp.ItemsSource = dt.DefaultView;

                foreach (DataRow row in dt.Rows)
                {
                    ThreeStrikeStatus.Add(row["StrikeStage"].ToString());
                }
                for (int i = 0; i < ThreeStrikeStatus.Count; i++)
                {
                    if (ThreeStrikeStatus[i] == "ONE")
                    {
                        DG_FollowUp.GetCell(i, 7).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 7).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 9).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 9).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 10).IsEnabled = false;
                    }
                    else if (ThreeStrikeStatus[i] == "TWO")
                    {
                        DG_FollowUp.GetCell(i, 7).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 7).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 8).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 8).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 10).IsEnabled = false;
                    }
                    else if (ThreeStrikeStatus[i] == "THREE")
                    {
                        DG_FollowUp.GetCell(i, 7).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 7).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 8).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 8).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 9).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 9).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 10).IsEnabled = true;
                    }
                    else if (ThreeStrikeStatus[i] == "")
                    {
                        DG_FollowUp.GetCell(i, 8).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 8).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 9).IsEnabled = false;
                        DG_FollowUp.GetCell(i, 9).Visibility = Visibility.Hidden;
                        DG_FollowUp.GetCell(i, 10).IsEnabled = false;
                    }
                }
                DG_FollowUp.UpdateLayout();

如果上述有任何错误,或者是否有任何其他方法可以实现所需的功能,请告诉我。

我还面临一个问题,即根据从 db 获得的值检查 datagridtemplatecolumn 中的复选框。如果您对此有任何解决方案,请帮助我。

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    使用 Binding 方法时,不应使用刷新或重新加载 DataGrid 数据。绑定的全部意义在于实现 INotifyPropertyChanged 并让代理为您更新您的 UI。

    这是一个显示如何实现INotifyPropertyChanged的链接

    How to implement DataTable property with INotifyPropertyChanged

    我个人对DataTable 所做的是将其放入CollectionViewSource 并绑定到它。

    视图模型

    public class ViewModel
    {
        //Properties
        CollectionViewSource _CollectionViewSource { get; set; }
        DataTable dt { get; set; }
        
        //Constructor
        public ViewModel() 
        {
            _CollectionViewSource.Source = dt.DefaultView
        } 
    }
    

    XAML

    <DataGrid ItemsSource="{Binding _CollectionViewSource.View}" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2023-03-06
      • 1970-01-01
      • 2012-10-08
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多