2012-03-13 4 views
3

Я пытаюсь отфильтровать столбец крайнего срока в datagridview на 2 datetimepickers - startDate и endDate.Фильтрация datagridview с использованием дат

DataGridView является TaskTable2, DateTimePicker1 является startSchedule, datetimepicker2 является endSchedule и срок в DataGridView является deadlineRow

До сих пор я получил следующий код, который успешно делает строки невидимые, которые не находятся между выбранным началом и дата окончания.

private void scheduleButton_Click(object sender, EventArgs e) 
    { 

     DateTime startSchedule = startDate.Value.Date; 
     DateTime endSchedule = endDate.Value.Date; 

     if (startSchedule <= endSchedule)// runs foreach loop if startdate and enddate are valid 
     { 
      foreach (DataGridViewRow dr in TaskTable2.Rows)// loops through rows of datagridview 
      { 
       string deadline = dr.Cells["Deadline"].Value.ToString(); // gets deadline values 
       DateTime deadlineRow = Convert.ToDateTime(deadline); // converts deadline string to datetime and stores in deadlineRow variable 

       if (startSchedule <= deadlineRow && deadlineRow <= endSchedule) // filters deadlines that are => startDate and <= endDate 
       { 
        dr.Visible = true; // display filtered rows here. 
       } 
       else 
       { 
        dr.Visible = false; // hide rows that are not beteen start and end date. 
       } 

      } 
     } 
     else 
     {  
      MessageBox.Show("Please ensure Start Date is set before End Date."); // ensures user selects an end date after the start date. 
     } 
    } 

Однако, у меня есть несколько существующих проблем:

  1. сбой приложения, и я получаю следующее сообщение об ошибке, когда я выбрать диапазон дат, который не будет отображать задачи:

' Строка, связанная с позицией валютного менеджера, не может быть сделана невидимой '

  1. У меня есть pri nt, которая должна печатать отфильтрованные результаты. Однако он печатает все данные, хранящиеся в datagridview, даже если некоторые строки видны = false из нажатия кнопки расписания, поэтому я предполагаю, что мне нужно использовать другой подход, чтобы удалить строки, а не скрывать их.

Datagridview привязан к файлу XML, поэтому данные могут быть удалены из datagridview для фильтрации и печати в течение длительного времени, пока они остаются в файле XML.

Любая помощь была бы принята с благодарностью!

Thankyou

ответ

3

Я хотел бы использовать Filter собственность на bindingsource для datagridview. Свойство Filter позволяет просмотреть подмножество DataSource.

Пример из MSDN:

private void PopulateDataViewAndFilter() 
{ 
    DataSet set1 = new DataSet(); 

    // Some xml data to populate the DataSet with. 
    string musicXml = 
     "<?xml version='1.0' encoding='UTF-8'?>" + 
     "<music>" + 
     "<recording><artist>Coldplay</artist><cd>X&amp;Y</cd></recording>" + 
     "<recording><artist>Dave Matthews</artist><cd>Under the Table and Dreaming</cd></recording>" + 
     "<recording><artist>Dave Matthews</artist><cd>Live at Red Rocks</cd></recording>" + 
     "<recording><artist>Natalie Merchant</artist><cd>Tigerlily</cd></recording>" + 
     "<recording><artist>U2</artist><cd>How to Dismantle an Atomic Bomb</cd></recording>" + 
     "</music>"; 

    // Read the xml. 
    StringReader reader = new StringReader(musicXml); 
    set1.ReadXml(reader); 

    // Get a DataView of the table contained in the dataset. 
    DataTableCollection tables = set1.Tables; 
    DataView view1 = new DataView(tables[0]); 

    // Create a DataGridView control and add it to the form. 
    DataGridView datagridview1 = new DataGridView(); 
    datagridview1.AutoGenerateColumns = true; 
    this.Controls.Add(datagridview1); 

    // Create a BindingSource and set its DataSource property to 
    // the DataView. 
    BindingSource source1 = new BindingSource(); 
    source1.DataSource = view1; 

    // Set the data source for the DataGridView. 
    datagridview1.DataSource = source1; 

    //The Filter string can include Boolean expressions. 
    source1.Filter = "artist = 'Dave Matthews' OR cd = 'Tigerlily'"; 
} 

Я использую этот тип Filter, чтобы показать данные, основанные на счете. Для учетной записи у меня есть текстовое поле, когда пользователь помещает номер учетной записи, и я использую событие TextChanged для применения фильтра. Затем у меня есть кнопка, которая используется для удаления фильтра из источника привязки.

Если вы хотите отфильтровать по дате Вы можете, следуя инструкциям в этом СЦ вопрос:

BindingSource Filter by date

Использование фильтра на дату, которая не присутствует не врезаться приложение, оно будет просто отображать ничего ,

2

Найдено решение, за исключением здесь: http://discuss.itacumens.com/index.php?topic=16375.0

Я добавил это в мой код непосредственно перед тем, как пытаться установить строку быть не видна. row - моя переменная ForEach.Я проверяю, выбрано ли оно, и если он пытается очистить выбор строки и ячейки до установки свойства visible.

  If gridItems.SelectedRows.Count > 0 AndAlso row.Index = gridItems.SelectedRows(0).Index Then 
       'fixes dumb exception with row.visible = false 
       gridItems.ClearSelection() 
       gridItems.CurrentCell = Nothing 
      End If 

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

+0

Похоже, вам даже не нужно сначала очистить выбор; просто установив CurrentCell в null/ничего не сделал трюк для меня. Спасибо за совет! –

1

Я столкнулся с одной и той же проблемой с исключением: «Строка, связанная с позицией валютного менеджера, не может быть сделана невидимой».

dgridView.CurrentCell = null; 
dgridView.Rows[i].Visible = false; 

Просто установив CurrentCell в null, он был исправлен для меня. Я еще не проверял его, если он что-то сломал.

Смежные вопросы