0

我创建了一个包含数据网格的 WPF vb.net 表单。在数据网格内部,我有两个组合框和两个文本框,一个组合框文本框对用于文章,另一个用于服务。我应该将第一个组合绑定到 List(Of article) 类型的属性,第二个绑定到 List(Of service) 类型,其中文章是包含两个公共属性(articleId 和 articleName)的公共类,服务是包含两个公共属性(serviseId 和 serviceName)的公共类)。文本框应显示文章和服务名称,组合框应显示 ID。当组合选择更改时,文本框文本也应更改其值。

List(Of article) 和 List(Of service) 应该从数据库中填充。

我怎么能做到这一点,我知道解决方案在我周围的某个地方,但根本无法捕捉到它。有两个主要问题,绑定控件和数据库中的填充列表。

如果我需要发布部分代码,我会这样做,请告诉我。

请帮我解决这种情况,

谢谢。

4

2 回答 2

0

首先 - 抱歉,我对 VB.Net 不是很熟悉,所以我的代码是用 c# 编写的。由于我不了解您的实际需求,因此我只能为您提供以下不太优雅的解决方案。

要将您绑定ComboBox到数据库中的项目,您需要使用 a StaticResource,我可以看到您做到了,但也许您定义错​​误,这就是它不适合您的原因。为了让它工作,你需要有一个这样的类:

public class artiklsList : List<artikl>
{
    public artiklsList()
    {
        this.Add(new artikl(1, "first")); //this is dummy items, you need to do a database stuff here
        this.Add(new artikl(2, "second"));
        this.Add(new artikl(3, "third"));
    }
}

像这样的xaml:

<Window.Resources>
    <my:artiklsList x:Key="source"></my:artiklsList>
</Window.Resources>

ComboBox选择更改时,您还需要更新带有文本的单元格。这不是一项简单的任务,因为使用Binding控件执行此操作的最简单方法ElementNameDataGrid. 无论如何,我所做的有点hacky...

所以,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 SelectedIndex="{Binding selectedIndexID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Name="cmbArtikli" Width="120" DisplayMemberPath="artiklId" ItemsSource="{StaticResource source}">
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Naziv artikla"  Binding="{Binding nazivArtikla}"/>          
        </DataGrid.Columns>
    </DataGrid>

更新文本单元格的绑定SelectedIndex和可怕的代码隐藏。为了使绑定正常工作,articl类必须实现INotifyPropertyChanged接口。

public class artikl: INotifyPropertyChanged
{ 
    public artikl(int artid, string nazivart)
    {
        artiklId = artid;
        nazivArtikla = nazivart;
    }

    public int artiklId{get;set;}

    private string _nazv;
    public string nazivArtikla
    {
        get { return _nazv; }
        set { _nazv = value; NotifyPropertyChanged("nazivArtikla"); }
    }

    //Here I think you may have questions
    private int _index;
    public int selectedIndexID 
    {
        get 
        {
            //To get a SelectedIndex for ComboBox in current row we look in 
            //listArtikli defined in a MainWindow for a articli item with a current 
            //item's Id and take the index of this item
            artikl art = MainWindow.listArtikli.Find(el => el.artiklId == this.artiklId);
            return MainWindow.listArtikli.IndexOf(art);
        } 
        set 
        {
            //This property is binded with SelectedIndex property of ComboBox.
            //When selected index changed, we look in listArtikli and take 
            //here properties of item with this index.
            //This will change values of item binded to the current grid row
            _index = value;
            this.nazivArtikla = MainWindow.listArtikli[value].nazivArtikla;
            this.artiklId = MainWindow.listArtikli[value].artiklId;
            NotifyPropertyChanged("selectedIndexID");
        } 
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

还有一个窗口代码隐藏:

public partial class MainWindow : Window
{
    public static artiklsList listArtikli = new artiklsList();
    public static artiklsList gridsource = new artiklsList();
    public MainWindow()
    {
        InitializeComponent();
        dgrStavke.ItemsSource = gridsource;
    }
}

你需要gridsource除了listArtikli填充你DataGrid的价值观。也因为所有这些代码,selectedIndexID如果你只使用listArtikli它的值就会损坏。SolistArtikli包含articli刚刚按检索顺序排序的项目。并gridsource包含对artiklId-nazivArtikla正如它们在DataGrid. 希望它对你有一点帮助。

于 2013-11-09T19:31:54.793 回答
0

感谢有趣。如果您需要更多说明,请告诉我。这是一对组合框文本框的代码,我很容易将其应用于另一对: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="cmbArtikli" Width="120" ItemsSource="{Binding Source={StaticResource artcls}, Path=listArtikli}" DisplayMemberPath="artiklId"></ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>                    
                </DataGridTemplateColumn>
                <DataGridTextColumn Header="Naziv artikla" Binding="{Binding nazivArtikla}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>

...

代码

Imports System.Data
Imports System.Data.SqlClient
Imports System.Text
Namespace MW

    Public Class artikl

        Sub New(artid As Integer, nazivart As String)
            ' TODO: Complete member initialization 
            artiklId = artid
            nazivArtikla = nazivart
        End Sub

        Public Property artiklId() As Integer
        Public Property nazivArtikla() As String
    End Class

    Public Class frmDodavanjePaketa
    Public Property listArtikli() As New List(Of artikl)

    Private Sub popuniComboArtikli()
            Dim sqlConn As SqlConnection = New SqlConnection(moduleGlobal.connString)
            sqlConn.Open()
            Dim strSql As New StringBuilder
            strSql.Append("select a.artiklId, a.nazivArtikla ")
            strSql.Append(" from artikli a ")
            strSql.Append(" where isnull(a.aktivan, 0) = 1")

            Dim sqlCom As SqlCommand = New SqlCommand(strSql.ToString, sqlConn)
            Dim sqlDs As DataSet = New DataSet
            Dim sqlDa As SqlDataAdapter = New SqlDataAdapter
            sqlDa.SelectCommand = sqlCom
            sqlDa.Fill(sqlDs)

            For Each row As DataRow In sqlDs.Tables(0).Rows
                Me.listArtikli.Add(New artikl(row.ItemArray(0).ToString, row.ItemArray(1).ToString))
            Next

        End Sub
      End Class
      End Namespace
于 2013-11-07T13:16:14.587 回答