Распределение содержимого DataTable на 3 DataGridViews - PullRequest
0 голосов
/ 09 августа 2010

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

В форме мне нужно отобразить эту информацию на 3 разных DataGridView, чтобы пользователь мог ее изменить. Схема та же, но каждый из DataGridView будет отображать разные категории и, следовательно, скрывать некоторые нерелевантные столбцы в каждом из DataGridView, но в базе данных они все являются частью одной и той же таблицы. Новые строки могут быть добавлены пользователем на всех 3 DataGridView.

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

Я предполагаю, что мог бы разбить мой основной DataTable на три из них, а затем привязать каждый DataTable к соответствующему DataGridView, но это не создаст проблем, когда я захочу сохранить изменения (обновленные и новые строки) в базе данных учитывая, что мои изменения распределены в 3 DataTables вместо одного?

Есть ли лучший способ достичь этого, чем разделять основной DataTable в первую очередь?

Заранее большое спасибо.

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Все DataGridViews должны иметь свой собственный DataView.Самым простым способом может быть использование отдельных компонентов BindingSource.

Когда вы заявляете:

 dataGridView1.DataSource = dataTable1;

Вы фактически используете DataView по умолчанию для таблицы.Вы ищете что-то вроде:

//untested
var view1 = new DataView(dataTable1);
dataGridView1.DataSource = view1;
var view2 = new DataView(dataTable1);
dataGridView2.DataSource = view2;

И затем вы можете использовать view1, view2 для управления фильтрацией и сортировкой.

1 голос
/ 09 августа 2010

Большое спасибо, Хенк, твой пост привел меня на правильный путь, и он отлично решил мою проблему. Теперь я могу добавлять элементы в любые виды сетки, и мой DataTable обновляется без необходимости выполнять какие-либо действия, такие как слияние, как я ожидал.

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

private DataTable fruitsDataTable = null;
private DataView orangesDataView = null;
private DataView applesDataView = null;

private void Form1_Load(object sender, EventArgs e)
    {
        fruitsDataTable = new DataTable("Fruits");

        // Dynamically create the DataTable schema for the sake of this example
        fruitsDataTable.Columns.Add("Category", typeof(string));
        fruitsDataTable.Columns.Add("Description", typeof (string));
        fruitsDataTable.Columns.Add("Quantity", typeof(int));
        fruitsDataTable.Columns.Add("Price", typeof(double));

        // Add the fruits to the main table
        fruitsDataTable.Rows.Add("ORANGE", "Fresh Oranges", 5, 5.50);

        fruitsDataTable.Rows.Add("APPLE", "Granny Smith Apples", 10, 2.20);
        fruitsDataTable.Rows.Add("APPLE", "Golden Apples", 40, 1.75);

        fruitsDataTable.Rows.Add("ORANGE", "Bloody Oranges", 10, 7.99);

        fruitsDataTable.Rows.Add("BANANA", "Ivory Coast Bananas", 5, 6.99);

        mainGridView.DataSource = fruitsDataTable;

        // Create a DataView for each fruit category and bind it to the relevant DataGridView control on the form
        orangesDataView = new DataView(fruitsDataTable, "Category = 'ORANGE'", string.Empty, DataViewRowState.CurrentRows);
        orangesGridView.DataSource = orangesDataView;

        applesDataView = new DataView(fruitsDataTable, "Category = 'APPLE'", string.Empty, DataViewRowState.CurrentRows);
        applesGridView.DataSource = applesDataView;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...