簡體   English   中英

更新綁定到dataSet dataTable的listView,該表從SQL c#wpf查找數據

[英]Update listView bound to dataSet dataTable which looks up data from SQL c# wpf

嘗試更新與數據集綁定的listView時,我遇到了一個奇怪的問題。

dataSet從SQL獲取其信息,並且需要每5分鍾自動更新一次。 目前,我正在使用backgroudWorker來獲取新信息並將其插入到dataSet中。

然后在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();時,此方法有效 在啟動時。

但是,當計時器調用它時,表將變為空白(所有數據均被刪除)。 如果我嘗試在列表中滾動查看,則會收到錯誤消息

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

<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>

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();
    }

    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();
        }
    }

    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.UpdateLayout();
    }
}

}

嘗試刷新方法。 重新綁定后。

更新。

如果查詢時間較長,則在從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();
}

@布拉姆你說得對。 我添加了listView1.Items.Refresh(); 到RunComplete事件,現在可以使用了。

非常感謝大家的幫助。 如果有人遇到以下相同問題,那么此小示例的完整代碼將在后台更新中起作用。

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");
    }
}

}

XAML

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM