Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新绑定到dataSet dataTable的listView,该dataSet dataTable从SQL c wpf查找数据_C#_Sql_Wpf_Listview_Datatable - Fatal编程技术网

C# 更新绑定到dataSet dataTable的listView,该dataSet dataTable从SQL c wpf查找数据

C# 更新绑定到dataSet dataTable的listView,该dataSet dataTable从SQL c wpf查找数据,c#,sql,wpf,listview,datatable,C#,Sql,Wpf,Listview,Datatable,我在尝试更新绑定到数据集的listView时遇到了一个奇怪的问题 数据集从SQL获取信息,需要每5分钟自动更新一次。目前,我正在使用BackgroundWorker获取新信息并将其插入数据集中 然后在RunWorkerCompleted事件上执行此操作 listView1.DataContex = dataSet.Tables["table"].DefaultView DoWork事件包含如下内容 dataSet.Clear(); SqlDataAdapter adapter = new S

我在尝试更新绑定到数据集的listView时遇到了一个奇怪的问题

数据集从SQL获取信息,需要每5分钟自动更新一次。目前,我正在使用BackgroundWorker获取新信息并将其插入数据集中

然后在RunWorkerCompleted事件上执行此操作

listView1.DataContex = dataSet.Tables["table"].DefaultView
DoWork事件包含如下内容

dataSet.Clear();

SqlDataAdapter adapter = new SqlDataAdapter(
                "SELECT [ContainerID] ,[UserID], [Spur], [Wave] ,[Date] FROM [ScannedItems] " + 
                "WHERE [Message] LIKE '%Success%'" + 
                "UNION ALL " +
                "SELECT [ContainerID] ,[UserID], [Spur], [Wave] ,[Date] FROM [Workstation].[dbo].[AllSpurs] " +
                "WHERE [Message] LIKE '%" + "Success" + "' ORDER BY [Date] DESC", connection);


            DataTableMapping mapping = adapter.TableMappings.Add("Table", "Packages Scanned");
            mapping.ColumnMappings.Add("ContainerID", "Cont");
            mapping.ColumnMappings.Add("UserID", "User");
            mapping.ColumnMappings.Add("Spur", "Spur");
            mapping.ColumnMappings.Add("Wave", "Wave");
            mapping.ColumnMappings.Add("Date", "Date");

            connection.Open();

            adapter.FillSchema(dataSet, SchemaType.Mapped);
            adapter.Fill(dataSet);

            connection.Close();
当我调用worker.RunWorkerAsync时,这个功能就可以工作了;在启动时

但是,当计时器调用它时,表变为空白,所有数据都被删除。如果我尝试在listVIew中滚动,我会得到一个错误

Object reference not set to the instance of an object
但是,如果我单击其中一列的标题,新数据将可见,并且可以滚动

谁能告诉我我做错了什么

这是listView的XAML

<ListView ItemContainerStyle="{StaticResource cnListView}" ItemsSource="{Binding Path=Table}" Margin="7,5,31,7" Name="listView2" SelectionMode="Multiple" util:GridViewSort.AutoSort="True" LostFocus="LostFocus">
                    <ListView.View>
                        <GridView x:Name="gridView1" AllowsColumnReorder="False" ColumnHeaderTemplate="{StaticResource cnDataViewHeader}">
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Cont}" util:GridViewSort.PropertyName="Cont" Header="ContainerID" Width="350" />
                            <GridViewColumn DisplayMemberBinding="{Binding Path=User}" util:GridViewSort.PropertyName="User" Header="User" Width="200" />
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Spur}" util:GridViewSort.PropertyName="Spur" Header="Spur" Width="120" />
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Wave, StringFormat='dd-MM-yyyy HH:mm:ss'}" util:GridViewSort.PropertyName="Wave" Header="Wave" Width="250" />
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Date, StringFormat='dd-MM-yyyy HH:mm:ss'}" util:GridViewSort.PropertyName="Date" Header="Time Scanned" Width="250" />
                        </GridView>
                    </ListView.View>
                </ListView>
多谢各位

较小的项目完整代码:

XAML

c


}@怪你是对的。我添加了listView1.Items.Refresh;到RunComplete事件,现在它可以工作了

非常感谢大家的帮助。如果有人有同样的问题,下面是这个小例子的完整代码和工作背景更新

C

}

XAML


@怪你是对的。我添加了listView1.Items.Refresh;到RunComplete事件,现在它可以工作了

非常感谢大家的帮助。如果有人有同样的问题,下面是这个小例子的完整代码和工作背景更新

C

}

XAML


尝试刷新方法。重新绑定后。

尝试刷新方法。重新绑定后。

更新

如果查询相当长,则在从SQL读取数据时会发生错误

为了阻止这种情况发生,我将listView绑定到另一个表中,该表的数据与旧版本的SQL相同。按钮点击事件现在被激活

private void button1_Click(object sender, RoutedEventArgs e)
{

    DataTable oldTable = dataSet.Tables["Stores"].Copy();
    listView1.DataContext = oldTable.DefaultView;
    listView1.Items.Refresh();

    backWorker.RunWorkerAsync();
}
更新

如果查询相当长,则在从SQL读取数据时会发生错误

为了阻止这种情况发生,我将listView绑定到另一个表中,该表的数据与旧版本的SQL相同。按钮点击事件现在被激活

private void button1_Click(object sender, RoutedEventArgs e)
{

    DataTable oldTable = dataSet.Tables["Stores"].Copy();
    listView1.DataContext = oldTable.DefaultView;
    listView1.Items.Refresh();

    backWorker.RunWorkerAsync();
}

看起来应该行得通,但表重复了。请尝试ItemsSource=Binding,无路径。谢谢您的评论。我已经编辑了我的XAML以使ItemsSource={Binding}。它仍然不起作用。我只能假设这与我正在使用的排序代码有关。当我单击列标题时,它会显示正确的排序信息,我可以滚动。我不知道为什么这会是个问题,我不明白。XAML定义了一个名为='listView2'的ListView,但在代码中设置listView1.DataContext=xxxx。。。。可能是打字错误?一种猜测是排序会刷新。尝试刷新方法。在你重新绑定之后。谢谢伙计们@HighCore是的,那是个打字错误。对不起。我已经创建了一个项目,其中有这个问题,但没有任何其他代码。请参阅我编辑的文章,了解完整的xaml和c,其中仍然存在此问题。看起来它应该可以工作,但表是重复的。请尝试ItemsSource=Binding,无路径。谢谢您的评论。我已经编辑了我的XAML以使ItemsSource={Binding}。它仍然不起作用。我只能假设这与我正在使用的排序代码有关。当我单击列标题时,它会显示正确的排序信息,我可以滚动。我不知道为什么这会是个问题,我不明白。XAML定义了一个名为='listView2'的ListView,但在代码中设置listView1.DataContext=xxxx。。。。可能是打字错误?一种猜测是排序会刷新。尝试刷新方法。在你重新绑定之后。谢谢伙计们@HighCore是的,那是个打字错误。对不起。我已经创建了一个项目,其中有这个问题,但没有任何其他代码。请参阅我编辑的文章,了解完整的xaml和c,其中仍然存在此问题。
namespace backWorkerTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    DataSet dataSet = new DataSet();
    BackgroundWorker backWorker = new BackgroundWorker();

    public MainWindow()
    {
        InitializeComponent();

        dataSet.Tables.Add("Stores");

        backWorker.DoWork += new DoWorkEventHandler(backWorker_DoWork);
        backWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backWorker_RunWorkerCompleted);

        backWorker.RunWorkerAsync();
    }

    #region Fill dataSet
    void GetData()
    {
        using (SqlConnection con = new SqlConnection(@"Data Source=CN-LT08\Nick;Initial Catalog=SorterAdmin;" +
                                                     "User=sa; Password=Altrincham09"))
        {
            SqlDataAdapter sql = new SqlDataAdapter("SELECT [Store Number], [Store Name] FROM [Store_Info]", con);

            DataTableMapping mapping = sql.TableMappings.Add("Table", "Stores");
            mapping.ColumnMappings.Add("Store Number", "Test");
            mapping.ColumnMappings.Add("Store Name", "Test2");

            con.Open();
            sql.FillSchema(dataSet, SchemaType.Mapped);
            sql.Fill(dataSet);
            con.Close();
        }
    }
    #endregion

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        backWorker.RunWorkerAsync();
    }

    private void backWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        dataSet.Clear();
        GetData();
    }

    private void backWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        listView1.ItemsSource = dataSet.Tables["Stores"].DefaultView;
        listView1.Items.Refresh();

        //MessageBox.Show("Complete");
    }
}
<Window x:Class="backWorkerTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="502" Width="989">
<Grid>
    <ListView ItemsSource="{Binding MeetCollection}" Height="340" HorizontalAlignment="Left" Margin="12,12,0,0" Name="listView1" VerticalAlignment="Top" Width="914">
        <ListView.View>
            <GridView>
                    <GridViewColumn Header="Test" DisplayMemberBinding="{Binding Path=Test}"/>
                    <GridViewColumn Header="Test2" DisplayMemberBinding="{Binding Path=Test2}"/>
            </GridView>
        </ListView.View>
    </ListView>
        <Button Content="Button" Height="63" Name="button1" Width="288" Click="button1_Click" Margin="368,388,311,12" />
</Grid>
private void button1_Click(object sender, RoutedEventArgs e)
{

    DataTable oldTable = dataSet.Tables["Stores"].Copy();
    listView1.DataContext = oldTable.DefaultView;
    listView1.Items.Refresh();

    backWorker.RunWorkerAsync();
}