2016-07-09 4 views
2

Я разрабатываю приложение vb.net, и у меня есть dgv, который отображает список сотрудников. У dgv есть несвязанный столбец флажка, который используется при выборе сотрудников для требуемого действия. Я использую rowFilter, чтобы отфильтровать список по отделам или местоположению или независимо от того, что пользователь выбирает.Отфильтруйте DataGridView без потери несвязанных изменений

Если пользователь фильтрует использование Департамента 1 и проверяет флажки рядом с работниками, которых он хочет, чтобы выбрать их, а затем фильтрует в Отдел 2, чтобы выбрать еще нескольких сотрудников, когда мы отфильтровываем обратно в Департамент 1, проверенные сотрудники больше не проверяются.

Как я могу сделать так, чтобы после проверки сотрудника вы можете фильтровать другие параметры с потерей более ранних выборов. Im думает о сохранении проверенного состояния каждого сотрудника к базе данных перед следующим фильтром, но я чувствую, что это, возможно, более быстрый путь. Здесь?

Это код, я использую, чтобы заполнить DGV

sql = "SELECT employee_paysetup.EmployeeNumber AS EmployeeNo, employee_paysetup.FName, employee_paysetup.MName, " _ 
       & "employee_paysetup.LName, (case when employee_paysetup.MName = ' ' then concat(employee_paysetup.FName,' ' , employee_paysetup.LName) else " _ 
       & "concat(employee_paysetup.FName,' ' , employee_paysetup.MName,' ' , employee_paysetup.LName) end) " _ 
       & "AS FullName, costcenters.CostCenterName AS cosName, departments.DepartmentName AS depName, " _ 
       & "positions.PositionName AS posName, locations.LocationName AS locName, CostCenter, Department, Position, EmployeeLocation, PayGroup " _ 
       & "FROM ((((((employee_paysetup LEFT JOIN employees ON employee_paysetup.EmployeeNumber = employees.EmployeeNumber) " _ 
       & "LEFT JOIN costcenters ON employees.CostCenter = costcenters.CostCenterID) " _ 
       & "LEFT JOIN departments ON employees.Department = departments.DepartmentID) " _ 
       & "LEFT JOIN positions ON employees.Position = positions.PositionID) " _ 
       & "LEFT JOIN locations ON employees.EmployeeLocation = locations.LocationID) " _ 
       & "LEFT JOIN paygroups ON employee_paysetup.PayGroup = paygroups.ID) " & filterValue 
     cmd = New MySqlCommand(sql, conn) 
     cmd.Parameters.AddWithValue("@Status", "ACTIVE") 
     da.SelectCommand = cmd 
     dt.Clear() 
     da.Fill(dt) 
     'sort 
     dt.DefaultView.Sort = "FullName ASC" 
     dgvEmployees.DataSource = dt.DefaultView 

И я фильтровать с помощью

dt.DefaultView.RowFilter = "myFilter" 
+0

Преобразуйте сотрудников в «модель представления» и добавьте выбранное свойство, чтобы его можно было связать. – Crowcoder

+0

Crowcoder вы могли бы разработать немного больше, пожалуйста, –

+0

Вы должны отредактировать свое сообщение, чтобы добавить код, показывающий, что вы делаете и как. Мы не знаем ни одной детали. – Plutonix

ответ

1

Проблема в том, что у нас нет хранилища для несвязанного столбца. Достаточно простой способ сделать это - использовать DataTable. Добавьте Selected колонки через SQL, так что столбец создаются для него в DataTable:

Dim sql = "SELECT False As Selected, Id, Name, Descr, Bird, Color, ItemDate FROM Sample" 

С большинством поставщиков DB это будет работать нормально: таблица будет иметь логический столбец и DGV будет добавить колонку проверки для Это. Но есть небольшая проблема с MySQL, поскольку у него отсутствует способ CAST до Boolean или tinyint. В результате столбец будет текстовым. Так, MySql, пропустить SQL Выбранный столбец и добавить новый столбец в таблице:

' after the DS is built, but BEFORE it is bound to the DGV: 
Dim dc As New DataColumn("Selected", GetType(Boolean)) 
dc.DefaultValue = False ' important! 
dtSample.Columns.Add(dc) 
dc.SetOrdinal(0)   ' make it column 0 

Обязательно установите DefaultValue к чему-то или это будет DBNull для всех строк и заглушают столбец проверки.Также важно сделать это послеDataSource/DataTable построен, но до вы связываете его с DGV.

Вы также можете уловить и заменить столбец «Текст» для столбца «Проверка» в событии ColumnAdded. В любом случае NET знает, что это «виртуальный» столбец, поэтому он не будет мешать каким-либо объектам DBCommand, которые вы, возможно, создали для DataAdapter (OP can not имеет какие-либо основанные на этом запросе, но будущие читатели могут). Результаты:

enter image description here

я чек-выбранные несколько orange и Stork строк, затем фильтруют и чеки остались. По сути, это и ответ г-на Кроукодера делают то же самое по-другому: предоставьте где-то место хранения Selected. Этот метод использует обычную способность DGV автоматически сохранять на DataTable.


Если вы хотите использовать ColumnAdded событие:

If e.Column.Name = "Selected" AndAlso TypeOf e.Column Is DataGridViewTextBoxColumn Then 
    Dim dc As New DataGridViewCheckBoxColumn() 
    dc.HeaderText = "Selected" 
    dc.Name = "Selected" 
    dc.DataPropertyName = "Selected" 
    dc.ValueType = GetType(Boolean) 
    dgv5.Columns.Remove(e.Column) 
    dgv5.Columns.Insert(0, dc) 
    dc.DisplayIndex = 0 
End If 

действительно важная вещь чтобы назначить DataPropertyName так DGV знает, где в таблице для хранения данных.

Непосредственно добавление колонки в DataTable проще и более прямолинейно, это может быть полезно в других ситуациях.

+0

Работал !!! Спасибо Плутоникс. –

1

Допустим, у вас есть Employee:

Public Class Employee 
    Public Property EmpName As String 
    Public Property EmpNumber As Integer 
End Class 

И ваш Winform может иметь способ получить список сотрудников:

Public Function GetEmployees() As List(Of Employee) 
     'obviously, actually fill a list... 
     Return New List(Of Employee)() 
End Function 

Часто «Вид» (в вашем случае, winform) имеет разные потребности, чем исходные данные. Таким образом, вы делаете EmployeeViewModel:

Public Class EmployeeVM 
    Public Property EmpName As String 
    Public Property EmpNumber As Integer 
    Public Property EmpIsSelected As Boolean 
End Class 

Так редактировать GetEmployees получить и преобразовать список сотрудников в EmployeeVM список, и связать это с сеткой. Затем вы можете отфильтровать все, что хотите, и свойство EmpIsSelected сохранится.

Когда вы Save или что-то еще, вы преобразуете модель представления обратно в Employee.

Это рудиментарный шаблон MVVM, который решает проблему пользовательского интерфейса, имеющего разные потребности в данных, чем задний.

+0

Отлично. Я попробую это. Спасибо! –

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