删除一行后,它不会从屏幕上消失

时间:2014-11-05 11:46:20

标签: c# sqlite windows-phone-8 click

我正在使用sqlite数据库开发一个Windows Phone应用程序。我能够显示数据库并删除我要删除的特定行。但问题是在我选择行并单击删除后行不会消失那个时候。我必须租用那个页面才能看到它被删除了。 下面是我使用click_delete事件的类的代码

 public partial class History : PhoneApplicationPage
{
    ObservableCollection<historyTableSQlite> DB_HistoryList = new ObservableCollection<historyTableSQlite>();
    DbHelper Db_helper = new DbHelper();
    //public static int Selected_HistoryId;
    //int Selected_HistoryId;
    public static int Selected_HistoryId {get; set;}



    // string dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "db.sqlite");

    public History()
    {

        InitializeComponent();


    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {

        Db_helper.AddInfo();
        ReadHistoryList_Loaded();
        // Selected_HistoryId = int.Parse(NavigationContext.QueryString["SelectedHistoryID"]);
    }

    public void ReadHistoryList_Loaded()
    {
        ReadAllContactsList dbhistory = new ReadAllContactsList();
        DB_HistoryList = dbhistory.GetAllHistory();//Get all DB contacts
        ListData.ItemsSource = DB_HistoryList.OrderByDescending(i => i.Id).ToList();


        //Latest contact ID can Display first

    }

    public void ListData_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (ListData.SelectedIndex != -1)
        {
            historyTableSQlite listitem = ListData.SelectedItem as historyTableSQlite;
            History.Selected_HistoryId = listitem.Id;
        }
    }

    private void Delete_Click(object sender, EventArgs e)
    {
        Db_helper.DeleteContact(History.Selected_HistoryId);
        NavigationService.Navigate(new Uri("/History.xaml", UriKind.Relative));

    }

    private void DeleteAll_Click(object sender, EventArgs e)
    {
        DbHelper Db_helper = new DbHelper();
        Db_helper.DeleteAllContact();//delete all DB contacts
        DB_HistoryList.Clear();//Clear collections
        ListData.ItemsSource = DB_HistoryList;
    }



}
}
下面的

是具有所有主要功能的类

 public class DbHelper
{


    SQLiteConnection dbConn;


    public async Task<bool> onCreate(string DB_PATH)
    {
        try
        {
            if (!CheckFileExists(DB_PATH).Result)
            {
                using (dbConn = new SQLiteConnection(DB_PATH))
                {
                    dbConn.CreateTable<historyTableSQlite>();
                }
            }
            return true;
        }
        catch
        {
            return false;
        }
    }


    private async Task<bool> CheckFileExists(string fileName)
    {
        try
        {
            var store = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
            return true;
        }
        catch
        {
            return false;
        }
    }

    //retrieve all list from the database
    public ObservableCollection<historyTableSQlite> ReadHistory()
    {
        using (var dbConn = new SQLiteConnection(App.DB_PATH))
        {
            List<historyTableSQlite> myCollection = dbConn.Table<historyTableSQlite>().ToList<historyTableSQlite>();
            ObservableCollection<historyTableSQlite> HistoryList = new ObservableCollection<historyTableSQlite>(myCollection);
            return HistoryList;
        }
    }

    // Insert the new info in the histrorytablesqlite table. 
    public void Insert(historyTableSQlite newcontact)
    {
        using (var dbConn = new SQLiteConnection(App.DB_PATH))
        {
            dbConn.RunInTransaction(() =>
            {
                dbConn.Insert(newcontact);
            });
        }
    }

    public void AddInfo()
    {


            DbHelper Db_helper = new DbHelper();
            Db_helper.Insert((new historyTableSQlite
            {
                Date = DateTime.Now.ToShortDateString(),
                Time = DateTime.Now.ToShortTimeString(),
                Zone = Checkin.Zone_st,
                Floor = Checkin.Floor_st,
                latitude = Checkin.Latitud_do,
                longtitude = Checkin.Longtitude_do
            }));

        }



    // Delete specific contact
    public void DeleteContact(int Id)
    {
        using (var dbConn = new SQLiteConnection(App.DB_PATH))
        {
            var existingvalue = dbConn.Query<historyTableSQlite>("select * from historyTableSQlite where Id =" + Id).FirstOrDefault();
            if (existingvalue != null)
            {
                dbConn.RunInTransaction(() =>
                {
                    dbConn.Delete(existingvalue);
                });
            }
        }
    }

    //Delete all contactlist or delete Contacts table
    public void DeleteAllContact()
    {
        using (var dbConn = new SQLiteConnection(App.DB_PATH))
        {
            //dbConn.RunInTransaction(() =>
            //   {
            dbConn.DropTable<historyTableSQlite>();
            dbConn.CreateTable<historyTableSQlite>();
            dbConn.Dispose();
            dbConn.Close();
            //});
        }
    }
下面的

是包含所有表的类

public class historyTableSQlite : INotifyPropertyChanged
{
    [SQLite.PrimaryKey, SQLite.AutoIncrement]

    public int Id
    {
        get;
        set;
    }
    private int idValue;

    private string dateValue = string.Empty;

    public string Date
    {
        get { return this.dateValue; }
        set
        {
            if (value != this.dateValue)
            {
                this.dateValue = value;
                NotifyPropertyChanged("Date");
            }
        }
    }


    private string timeValue = string.Empty;
    public string Time
    {
        get { return this.timeValue; }
        set
        {
            if (value != this.timeValue)
            {
                this.timeValue = value;
                NotifyPropertyChanged("Time");
            }
        }
    }

    private string floorValue = string.Empty;
    public string Floor
    {
        get { return this.floorValue; }
        set
        {
            if (value != this.floorValue)
            {
                this.floorValue = value;
                NotifyPropertyChanged("Floor");
            }
        }
    }

    public string zoneValue;
    public string Zone
    {
        get { return this.zoneValue; }
        set
        {
            if (value != this.zoneValue)
            {
                this.zoneValue = value;
                NotifyPropertyChanged("Zone");
            }
        }
    }

    private double latValue;
    public double latitude
    {
        get { return latValue; }
        set
        {
            if (value != this.latValue)
            {
                this.latValue = value;
                NotifyPropertyChanged("Latitude");
            }
        }
    }

    private double lonValue;
    public double longtitude
    {
        get { return this.lonValue; }
        set
        {
            if (value != this.lonValue)
            {
                this.lonValue = value;
                NotifyPropertyChanged("Longitude");
            }
        }
    }

    // public string isMarkPoint { get; set; }

    public historyTableSQlite()
    {

    }

    public historyTableSQlite(string date, string time, string floor, string zone, double lat, double lng)
    {
        Date = date;
        Time = time;
        Floor = floor;
        Zone = zone;
        latitude = lat;
        longtitude = lng;
    }
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果您从ObservableCollection删除该项目,它将通知ListBox更新其容器。

在您的代码中

// this is correct
ObservableCollection<historyTableSQlite> DB_HistoryList = new ObservableCollection<historyTableSQlite>();

但问题是您实际上并未将ListBox相关联。

在您的代码中,您创建了一个副本(以及您尝试执行的最糟糕的副本),并将ListBox ItemsSource设置为它。见下文(你有这个)

ListData.ItemsSource = DB_HistoryList.OrderByDescending(i => i.Id).ToList();

基本上,你的ListBox不是ObservableCollection,而是List结构。

删除和插入列表不会更新ListBox的UI。

删除此列表,找到另一种方法对ObservableCollection进行排序。

然后你基本上可以这样做

ListData.ItemsSource = DB_HistoryList;  // set the listbox to the actual obs collection

DB_HistoryList.RemoveAt(i);             // remove the item at index i
DB_HistoryList.RemoveItem(object);      // remove the object that matches