【问题标题】:populate combobox inside the datagrid填充数据网格内的组合框
【发布时间】:2013-01-21 13:27:02
【问题描述】:

我有一个DataGrid 将数据插入到 Sql Server 表中。在DataGrid 内部,我有ComboBox 从码本中挑选数据(这是来自同一数据库的表)并将这些数据插入我绑定到DataGrid 的表中。这是 XAML:

<DataGrid Name="dgrStavke" AutoGenerateColumns="False" Height="160" Width="600" HorizontalAlignment="Left" Margin="5" Grid.Row="7" Grid.ColumnSpan="4">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Artikl ID">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Name="cmbArticle" Width="120" ></ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>                    
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Article Name" Width="150"></DataGridTextColumn>
            <DataGridTemplateColumn Header="Usluga ID">
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <ComboBox Name="cmbService" Width="120"></ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Service Name" Width="150"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

当我在组合框文章中选择文章 ID 时,下一个 DataGridTextColumn 应该显示这篇文章的名称。服务也是如此。可以插入少量文章和服务,这就是我使用Datagrid 的原因。

我该怎么做?

谢谢。

【问题讨论】:

  • 你在使用 MVVM 吗?您应该使用 MVVM 创建一个 ViewModel,以便您可以拥有一个用作 ComboBox 中的“选定项”的对象,然后将“选定项”Article Name 和 Service Name 绑定到相应的数据网格列跨度>

标签: c# wpf datagrid combobox


【解决方案1】:

我想下面的示例将帮助您实现目标

在 XAML 下面使用的代码中,

<Window.Resources>
        <ObjectDataProvider x:Key="RecordValues" ObjectType="{x:Type local:RecordTemp}" MethodName="GetPersonList" >            
        </ObjectDataProvider>
    </Window.Resources>
    <Grid>
        <Grid>
            <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}"
                  Margin="10,10,73,155" Name="dataGrid1">
                <DataGrid.Columns>
                    <DataGridComboBoxColumn Header="Artikl ID" Width="300" 
                                            SelectedValueBinding="{Binding SelectedPart, UpdateSourceTrigger=PropertyChanged}"                                            
                                            DisplayMemberPath="ArticleID"
                     ItemsSource="{Binding Source={StaticResource RecordValues}}" />

                    <DataGridTextColumn Header="Order Name" Binding="{Binding SelectedPart.ArticleName}" />
                </DataGrid.Columns>
            </DataGrid>            
        </Grid>
    </Grid>

在下面使用的 C# 代码中,

public class RecordTemp : INotifyPropertyChanged
{
    List<PartsList> _value = new List<PartsList>();

   public RecordTemp()
    {
        _value.Add(new PartsList() { ArticleID = "1", ArticleName = "one - 1", ArticleQuantity = 20 });
        _value.Add(new PartsList() { ArticleID = "2", ArticleName = "Two - 2", ArticleQuantity = 10 });
    }

    public List<PartsList> GetPersonList()
    {
        return _value;
    }

    private PartsList _SelectedPart;

    public PartsList SelectedPart
    {
        get { return _SelectedPart; }
        set
        {
            _SelectedPart = value;
             OnPropertyChanged("SelectedPart");
        }
    }

    public void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null  )
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }     


    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;



    #endregion
}

 public class PartsList
{
    public string ArticleID { get; set; }
    public double ArticleQuantity { get; set; }
    public string ArticleName { get; set; }
    }

在 MainWindow 中,下面的代码可以帮助绑定网格。

ObservableCollection<RecordTemp> RecordsTemp = new ObservableCollection<RecordTemp>();
RecordsTemp.Add(new RecordTemp());
RecordsTemp.Add(new RecordTemp());
dataGrid1.DataContext = RecordsTemp;   

如果您需要任何说明,请发表评论。我来帮你

【讨论】:

  • 感谢 Ramesh,我需要填充 DataGrid 填充列(组合文章 ID、组合服务 ID...)并将数据发送到数据库。我可以使用您的解决方案吗?如我所见,您逐行填写 RecordsTemp,如何从数据库中检索数据?我是否需要 dataGrid1 的 DataContext,因为填充组合框(文章和服务)很重要,但不是 datagrid 中的所有列?
【解决方案2】:
((ComboBox)GRID.Columns[N].FindControl("cmbArticle")).COMBO-BOX-PROPERTY

这是正确的语法吗?我不知道,我认为您正在寻找类似的东西。

【讨论】:

  • 谢谢,我的问题是如何使用 db 表对组合框进行数据绑定,我在代码隐藏中看不到组合,也不知道如何设置其数据源。
猜你喜欢
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多