Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Привязка DataSet к Combobox в гриде


Автор: RastaDja 20.7.2012, 09:20
Всем доброго времени суток!
Есть таблицы

project     eqipment
id                       id
idequipment      name
name


Связаные они по ключам project.idequipment  eqipment.id

В DataGrid нужно отобразить таблицу project, при этом idequipment должен отображатся, как выпадающий список с данными, которые записаны в eqipment.

Код

public partial class MainWindow : Window
    {
        static public dsProjectExpress dsData;
        static public string DataPath;

        // адаптеры для работы с данными
        static public dsProjectExpressTableAdapters.equipmentTableAdapter equipmentTA;
        static public dsProjectExpressTableAdapters.projectTableAdapter projectTA;

        public MainWindow()
        {
            InitializeComponent();

            dsData = new dsProjectExpress();
            // 
            // dsProjectExpress
            // 
            dsData.DataSetName = "dsProjectExpress";
            dsData.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;

            // загрузка данных
            equipmentTA = new dsProjectExpressTableAdapters.equipmentTableAdapter();
            equipmentTA.Fill(dsData.equipment);

            projectTA = new dsProjectExpressTableAdapters.projectTableAdapter();
            projectTA.Fill(dsData.project);

            taskGrid.DataContext = dsData;
        }
    }
}

Код

<DataGrid AutoGenerateColumns="False" Name="taskGrid"  ItemsSource="{Binding Path=project}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Наименование" Binding="{Binding Path=name}"/>
                
                <DataGridTemplateColumn Header="Оборудование">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="equipment" DisplayMemberPath="name" SelectedValuePath="id"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                                
                <DataGridTextColumn Header="Оборудование" Binding="{Binding Path=idequipment}"/>
            </DataGrid.Columns>
        </DataGrid>


Все мои попытки привязать данные к ComboBox не увенчались успехом.
Помогите пожалуйста в этом вопросе.

Автор: BoomeR 23.7.2012, 08:27
RastaDja, связь таблиц многие-к-одному (т.е. на один id_project приходится один id_equipment, а наоборот много)? Поясни тогда, что должно оказаться в ComboBox'e, если значение одно...

Автор: RastaDja 23.7.2012, 15:30
BoomeR, отношение много (project.idequipment) к одному (eqipment.id).
DataGrid должен отобразить таблицу project, при этом поле idequipment должно отобразится в виде ComboBox, значения в котором берутся с equipment.name.

Пробовал
Код

<DataGridTemplateColumn Header="Оборудование">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
       <ComboBox x:Name="equip" 
         ItemsSource="{Binding Path=DataContext.equipment}" 
         DisplayMemberPath="name" 
         SelectedValuePath="id"
         SelectedValue="{Binding idequipment}" />
     </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
 </DataGridTemplateColumn>

и так
Код

<DataGridComboBoxColumn 
      ItemsSource="{Binding RelativeSource={RelativeSource Findancestor, AncestorType={x:Type Window}}, Path=DataContext.equipment}"
      DisplayMemberPath="name"
      SelectedValuePath="id"
      SelectedValueBinding="{Binding idequipment}">
</DataGridComboBoxColumn>


ничего не выходит

Единственный вариант, который позволил отобразить данные, это создание комбоколнки в коде. Но, почему это не работает в xaml разметке, мне непонимаю
Код

Binding bind = new Binding("equipment")
{
    Mode = BindingMode.TwoWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
    ValidatesOnExceptions = true,
    ValidatesOnDataErrors = true
};
taskGrid.Columns.Add(new DataGridComboBoxColumn()
{
    Header = "Bla-bla",
    MinWidth = 100.0,
    ItemsSource = dsData.equipment,
    SelectedValuePath = "[0]",
    DisplayMemberPath = "[1]",
    SelectedValueBinding = bind
});


Я в замешательсте.  smile 

Автор: RastaDja 23.7.2012, 15:58
user posted image

Автор: RastaDja 24.7.2012, 12:08
Немогу понять, в чем проблема кроется
Код

<DataGrid Name="wtf" ItemsSource="{Binding Path=project}">
  <DataGrid.Columns>

    <DataGridComboBoxColumn x:Name="hoh" Header="Age" 
          ItemsSource="{Binding Path=equipment}" 
          DisplayMemberPath="name"
          SelectedValuePath="id"
          SelectedValueBinding="{Binding Path=idequipment}"/>
                
  </DataGrid.Columns>
</DataGrid>

ItemsSource не присваевается.
Но если написать в коде hoh.ItemsSource = dsData.equipment;
Данные отображаются.
Может кто-то знает в чем проблема, или есть догадки?
Тоесть - как правильно прописать ItemsSource?

Автор: BoomeR 25.7.2012, 08:45
RastaDja, снова я со своим занудством smile Никак не могу понять организацию БД. К примеру : есть проект "А" и на нем задействовано оборудование "1","2" и "3". В таблице Equipmnet n записей, три из них описывают оборудование "1","2" и "3". В таком случае для проекта "А" нужно создать три одинаковых строки с разными equip_id в таблице Project, верно?

Автор: RastaDja 25.7.2012, 12:22
BoomeR, Нет. Есть проект "А", в котором нужно произвести, всего лишь, одно из перечисленых "1", "2", "3" и т.д. оборудований

Здесь главный вопрос в том, как прописать правильно ItemsSource. В коде получается, а в разметке - нет. Хочется использовать шаблоны, (в том числе DatePicker), а привязка не работает. Если кто-нибудь сталкивался, подскажите пожалуйста!

Автор: BoomeR 26.7.2012, 08:19
А явное указание таблиц данных не помогает?

Код

<DataGrid Name="wtf" ItemsSource="{Binding Path=project}">
  <DataGrid.Columns>
    <DataGridComboBoxColumn x:Name="hoh" Header="Age" 
          ItemsSource="{Binding Path=equipment}" 
          DisplayMemberPath="name"
          SelectedValuePath="id"
          SelectedValueBinding="{Binding Path=project.idequipment}"/>
                
  </DataGrid.Columns>
</DataGrid>

Автор: RastaDja 26.7.2012, 11:23
Цитата(BoomeR @  26.7.2012,  09:19 Найти цитируемый пост)
А явное указание таблиц данных не помогает?

увы   smile 

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