Могут быть некоторые детали вашего случая, которые указывают на другое решение, но из того, что у вас есть здесь, звучит так, как будто вы должны отбросить специальный столбец, отбросить полное заполнение с фильтрацией и реализовать целевое заполнение для вашего DataGridView. Это даже не включает в себя большую часть изменений, небольшую модификацию, а не серьезную переписку.
Почему? Потому что, особенно если у вас есть удаленные работники в глобальной сети, снижение производительности при загрузке полного списка документов будет очень большим, если у вас много больших представлений. Сосредоточенная загрузка позволяет вам тратить время на загрузку только соответствующих деталей документа. Вы получаете первые 500 мс или около того "бесплатно" с пользователями, но если вы потратите хотя бы 30 секунд на загрузку и фильтрацию, они подумают, что это сбой. И ваше приложение занимает больше памяти, когда оно заполнено сеточными строками деталей документа, которые вы никогда не будете использовать. Кроме того, как вы уже обнаружили, придумать схему фильтрации, основанную на членстве в произвольном количестве перекрывающихся групп, действительно сложно, а целевую нагрузку действительно легко.
Так как это сделать? Сначала go к вашему DataSet и измените адаптер таблицы с помощью «Добавить» -> «Запрос». Вы определите новый запрос, который использует параметр (@View) и возвращает данные в том же формате, что и оригинал, но только для документов в этом представлении. Дайте ему очевидное имя, например, когда оно предлагает имя «Fill», сделайте его «FillByView»
Далее, возьмите копию кода в вашем событии Form_Load, которое заполняет сетку (что-то вроде tadaptDocs.Fill (tblDocList )) и закомментируйте его там, но поместите копию в событие Change для элемента управления, в котором пользователь выбирает представление. Измените его с «Fill» на «FillByView» и добавьте параметр @View.
Возможно, вы захотите, чтобы событие Form_Load установило представление на последний выбранный вид (сохраните в My.Settings) или на первый вид в списке, который вызовет событие Change и заполнит DataGridView начальным набором документов.
Теперь, каждый раз, когда пользователь выбирает новое представление, сетка загружается только с теми документами в этом представлении, независимо от того, в каких других представлениях они могут находиться.
При сохранении изменений через «Обновление» VB автоматически применяет изменения к базовым данным, вам не нужно беспокоиться о том, что он усечет вашу таблицу базы данных только до документов в это мнение. Это делает внутреннее различие между записями, которые были удалены, и записями, которые никогда не загружались. Вам также не нужно создавать новые версии методов Update, Insert или Delete в TableAdapter, только Fill Требуется новая версия, которая учитывает View.
EDIT: следующие дополнения в ответ на дополнения, разъясняющие проблема
Звучит так, как будто все еще требуется сфокусированная нагрузка, но только когда пользователь выбирает вид. Ваш первоначальный вид должен быть «заполнить все», но изменен для удаления дубликатов. Если у вас есть много деталей в сетке, вы, вероятно, захотите разбить это на 2 части с помощью CTE, пример следует
;WITH cteCust as (
SELECT D.DocID as DocID, D.docNum , D.docTitle , V.CustJoinName as CustJoin
, ROW_NUMBER() OVER (PARTITION BY D.docNum ORDER BY V.viewTitle) as ViewRank
FROM #tblDoc as D LEFT OUTER JOIN #MapDocView as M on D.DocID = M.DocID
OUTER APPLY fnGetCustJoinName(M.ViewID) as V
) SELECT C.DocID , C.docNum , C.docTitle , C.CustJoin , D.docOther
FROM cteCust as C INNER JOIN #tblDoc as D ON C.DocID = D.DocID
WHERE ViewRank = 1
ORDER BY D.docNum
Несколько элементов объяснения этого медведя, ответьте в комментариях, если вам нужно больше детали
cteCust извлекает информацию о базовом документе и добавляет пользовательские столбцы объединения, я не уверен, как вы это делаете, но функция с табличными значениями - это один из способов, и я ее использовал для простоты замените все, что вы используете. Вы сказали, что было много информации о документе, это позволяет вам работать только с основными деталями и t ie с другими материалами позже. Мы используем LEFT OUTER JOIN в таблице карт, потому что вы хотите, чтобы документы без представления все еще отображались в нефильтрованном списке.
ViewRank - это то, как вы Избавившись от дубликатов, разделив функцию ROW_NUMBER на Документы, вы получите только первое представление, в котором оно находится. В выделенной заливке вы хотите, чтобы представление фильтровалось, но вы сказали, что первоначальная заливка должна быть только одним представлением, поэтому каждый документ отображается только один раз.
Обратите внимание, что последний SELECT связывает его с таблицей документов, так что вы можете выбрать дополнительные поля.
ПРИМЕЧАНИЕ: В вашем примере у вас есть простая модель членства - вы хотите, чтобы Документы, принадлежащие указанному c представлению, не были иерархическим, где вы хотите, чтобы все документы в представлении и все вложенные представления ( то есть D006 находится в Утверждено , но не отображается при выборе родительского элемента Документы в примере 3 вашего обновленного вопроса). Если эти требования меняются, и ваши клиенты хотят рекурсивное сканирование членства, вы должны опубликовать его в качестве второго вопроса, этот вопрос и ответы уже огромны, и вы получите на sh взгляд, если это новый вопрос. Опубликуйте здесь ссылку, но задайте ей новый вопрос.