Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > master/detail в одном DataGridView


Автор: Linus 31.5.2007, 22:18
Тема, как я понимаю, заезженная, но ответа я так и не нашёл :(
В датасете есть две таблицы:

Cars
   driver_name  
   id_color------------|
   year                    |
   car_number        |
                              |
Colors                   |
   id_color -----------|
   name

Мне нужен DataGridView, в котором были бы колонки:
driver_name (TextBoxColumn), color (ComboboxColumn), year (TextBoxColumn), car_number (TextBoxColumn)

Сам цвет должен с учётом связи подгружаться из таблицы Colors, и светиться в ComboboxColumn. Всё это хотел как-то связать, чтобы DataGridView правильно отображал данные. А ещё хотел добавить строку в самый верх грида и заморозить её, чтобы введенные в эту строку значения были параметрами для фильтрации всех остальных колонок DataGridView. Вот и не могу придумать, как это всё реализовать, а в ручную (заполнение грида циклом и т.д.) не хочу. Помогите пожалуйста.

Автор: emmanuil 1.6.2007, 05:16
Вот тут есть пример как мастер-детатд делать, правдо там используется грид DevExpress, но это ничего не меняет, вместо него подставь свой.
http://forum.vingrad.ru/forum/topic-149519/kw-%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5.html

Автор: Linus 1.6.2007, 07:06
emmanuil, я уже так пробовал, но никак не получается, чтобы колонка с цветом была выпадающим списком :( Вместо комбобокса светится обычное текстовое поле с id цвета. Вот код:

Код

public Form1()
{
    InitializeComponent();
    DataGridView DGV = new DataGridView();
    DGV.Parent = this;
    DGV.Dock = DockStyle.Fill;

    DataSet ds = new DataSet("CarsColors");
    DataTable dtCars = new DataTable("Cars");
    dtCars.Columns.Add("driver_name");
    dtCars.Columns.Add("id_color");
    dtCars.Columns.Add("year");
    dtCars.Columns.Add("car_number");
    dtCars.Rows.Add(new object[] { "Иван Иванов Иванович", 1, 1956, "А013659" });
    dtCars.Rows.Add(new object[] { "Валера Валеров Валерович", 3, 1937, "C24679" });
    dtCars.Rows.Add(new object[] { "Пётр Петров Петрович", 2, 1994, "M012349" });

    DataTable dtColors = new DataTable("Colors");
    dtColors.Columns.Add("id_color");
    dtColors.Columns.Add("name");
    dtColors.Rows.Add(new object[] { 1, "Белый" });
    dtColors.Rows.Add(new object[] { 2, "Красный" });
    dtColors.Rows.Add(new object[] { 3, "Синий" });

    ds.Tables.Add(dtCars);
    ds.Tables.Add(dtColors);

    DataRelation rel = new DataRelation("relat", ds.Tables["Colors"].Columns["id_color"], ds.Tables["Cars"].Columns["id_color"]);
    ds.Relations.Add(rel);

    DGV.DataSource = ds.DefaultViewManager;
    DGV.DataMember = "Cars";
}

Автор: Linus 1.6.2007, 20:22
А хотел я сделать вот так:

Код

public Form1()
{
    InitializeComponent();
    DataGridView DGV = new DataGridView();
    DGV.Parent = this;
    DGV.Dock = DockStyle.Fill;

    DataSet ds = new DataSet("CarsColors");
    DataTable dtCars = new DataTable("Cars");
    dtCars.Columns.Add("driver_name");
    dtCars.Columns.Add("_id_color");
    dtCars.Columns.Add("year");
    dtCars.Columns.Add("car_number");
    dtCars.Rows.Add(new object[] { "Иван Иванов Иванович", 1, 1956, "А013659" });
    dtCars.Rows.Add(new object[] { "Валера Валеров Валерович", 3, 1937, "C24679" });
    dtCars.Rows.Add(new object[] { "Пётр Петров Петрович", 2, 1994, "M012349" });

    DataTable dtColors = new DataTable("Colors");
    dtColors.Columns.Add("id_color");
    dtColors.Columns.Add("name");
    dtColors.Rows.Add(new object[] { 1, "Белый" });
    dtColors.Rows.Add(new object[] { 2, "Красный" });
    dtColors.Rows.Add(new object[] { 3, "Синий" });

    ds.Tables.Add(dtCars);
    ds.Tables.Add(dtColors);

    DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
    column.HeaderText = ":)";
    column.DisplayMember = "name";
    column.ValueMember = "id_color";
    column.DataPropertyName = "_id_color";
    column.DataSource = ds.Tables["Colors"];

    DGV.DataSource = ds.DefaultViewManager;
    DGV.DataMember = "Cars";
    DGV.Columns.Insert(1, column);
}


В принципе, если поднять "DGV.Columns.Insert(1, column);" выше (после 33-й строки), и заменить единичку на нолик (вставка самого первого столбца), то само поле _id_column светиться не будет, а будут только комбобоксы (что и требовалось). Значит этот вопрос решён. А на счёт фильтрации буду отдельно думать...

Фсем пасиба smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)