Удалить или обновить DataTable - PullRequest
0 голосов
/ 21 июля 2011

У меня проблемы с приложением, которое я написал. По сути, это календарь на месяц, который состоит из панелей / списков на каждый день месяца. Я заполняю свои списки с помощью следующего:

private void PopulateEventListBoxes(int offsetNumber, int monthDays)
{
    string locationSelected = this.LocationComboBox.Text.ToLower();

    for (int i = 0; i <= (monthDays - 1); i++)
    {
        DateTime dateSelected = Convert.ToDateTime(m_ArrayDateLabel[offsetNumber + i].Text).Date;

        var tempCalendar = new Data.DataSet.vwGet_CalendarDetailsDataTable();

        switch (locationSelected)
        {
            case "all":
                Data.Manager.CalendarDetailsTableAdapter.FillByDate(tempCalendar, dateSelected);
                break;
            default:
                Data.Manager.CalendarDetailsTableAdapter.FillByDateCity(tempCalendar, dateSelected, locationSelected);
                break;
        }

        foreach (Data.DataSet.vwGet_CalendarDetailsRow row in tempCalendar)
        {
            ((ListBox)m_ArrayEventListBox[offsetNumber + i]).Items.Add(row.Name + " - " + row.StatusCode);
        }
    }
}

Я использую var tempCalendar = new Data.DataSet.vwGet_CalendarDetailsDataTable(); для DataTable, потому что мне нужно загрузить дневные события в каждое из списков. Эти данные поступают с сервера SQL из представления.

После загрузки календаря пользователи могут добавлять, редактировать и удалять элементы с помощью всплывающего диалогового окна с подробными сведениями о календаре на день. Когда диалог загружается для добавления / редактирования, я заполняю его следующим образом:

private void SearchForEventsByDate()
{
    switch (m_LocationSelected)
    {
        case "all":
            Data.Manager.CalendarDetailsTableAdapter.FillByDate(DataSetCalendar.vwGet_CalendarDetails, m_DateSelected);
            CalendarDetailsBindingSource.DataSource = DataSetCalendar.vwGet_CalendarDetails;
            break;
        default:
            Data.Manager.CalendarDetailsTableAdapter.FillByDateCity(DataSetCalendar.vwGet_CalendarDetails, m_DateSelected, m_LocationSelected);
            CalendarDetailsBindingSource.DataSource = DataSetCalendar.vwGet_CalendarDetails;
            break;
    }

    RefreshRepRecordCount();
}

На этот раз, когда загружаются данные, я использую вызов DataSetCalendar.vwGet_CalendarDetails вместо версии временной памяти данных.

Моя проблема вступит в игру, если я выполню следующие действия:

  1. Добавить новое событие для сотрудника
  2. Удалить то самое событие, которое я только что добавил
  3. Попробуйте добавить новое событие для сотрудника в тот же день - приложение выдает ошибку, что GUID уже присутствует в таблице.

Первичный ключ моей таблицы - EventDate и EmployeeGuid. Если я запрашиваю таблицу SQL после удаления, запись не появляется, но мое приложение все еще думает, что запись все еще существует. Я знаю, что запись находится в памяти.

Я пытался удалить его из памяти, но он не работает:

DataSetCalendar.vwGet_CalendarDetails.FindByEmployeeGUID(SelectedCalendarEvent.EmployeeGUID).Delete();
DataSetCalendar.vwGet_CalendarDetails.AcceptChanges();

Я также пытался использовать Remove, чтобы избавиться от записи, но мое приложение все еще думает, что запись существует. Я не знаю, что еще сделать или попробовать. Любая помощь будет отличной.

Ответы [ 2 ]

0 голосов
/ 25 июля 2011

Мне удалось это исправить, добавив Clear()

private void SearchForEventsByDate()
{
    switch (m_LocationSelected)
    {
       case "all":
         Data.Manager.Data.SM_T_Employee_Status.Clear();
         DataSetCalendar.vwGet_CalendarDetails.Clear();

         Data.Manager.CalendarDetailsTableAdapter.FillByDate(DataSetCalendar.vwGet_CalendarDetails, m_DateSelected);
          CalendarDetailsBindingSource.DataSource = DataSetCalendar.vwGet_CalendarDetails;
          break;
       default:
          Data.Manager.Data.SM_T_Employee_Status.Clear();
          DataSetCalendar.vwGet_CalendarDetails.Clear();
          Data.Manager.CalendarDetailsTableAdapter.FillByDateCity(DataSetCalendar.vwGet_CalendarDetails, m_DateSelected, m_LocationSelected);
          CalendarDetailsBindingSource.DataSource = DataSetCalendar.vwGet_CalendarDetails;
          break;
     }

 RefreshRepRecordCount();
 }
0 голосов
/ 21 июля 2011

Как вы «храните» календарь на стороне клиента?Знание этого приведет вас к ответу.Похоже, у вас есть какой-то тип кэша на стороне клиента.

Если вы кэшируете на стороне клиента, вам необходимо обновить кэш при изменении данных на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...