0

データグリッドを含む WPF vb.net フォームを作成しました。データグリッドの内部には、2 つのコンボボックスと 2 つのテキスト ボックスがあります。1 つは記事用のコンボ ボックス テキスト ボックスのペアで、もう 1 つはサービス用です。最初のコンボを List(Of article) タイプのプロパティにバインドし、2 番目を List(Of service) タイプにバインドする必要があります。ここで、article は 2 つのパブリック プロパティ (articleId と articleName) を含むパブリック クラスであり、service は 2 つのパブリック プロパティ (serviceId と serviceName) を含むパブリック クラスです。 )。テキストボックスには記事とサービスの名前を表示し、コンボボックスには ID を表示する必要があります。コンボの選択が変更されると、テキストボックスのテキストもその値を変更する必要があります。

List(Of article) および List(Of service) は、データベースから入力する必要があります。

どうすればこれを行うことができますか、解決策が私の周りのどこかにあることはわかっていますが、まったくキャッチできません。コントロールのバインドとデータベースからのリストの取り込みという 2 つの主な問題があります。

コードの一部を投稿する必要がある場合は、これを行います。お知らせください。

この状況を解決するために私を助けてください、

ありがとう。

4

2 に答える 2

0

興味を持ってくれてありがとう。さらに明確にする必要がある場合は、お知らせください。これはコンボボックスとテキストボックスの 1 つのペアのコードです。これを別のペアに簡単に適用できます: 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 に答える
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コントロールを使用してこれを行う最も簡単な方法は、 では機能しないため、単純な作業でElementNameはありません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 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別として必要です。また、その値のみを使用すると、このすべてのコードが破損するためです。そのため、取得された順に並べ替えられたアイテムが含まれます。で示したように、ペアが含まれています。少しでもお役に立てれば幸いです。listArtikliDataGridselectedIndexIDlistArtiklilistArtikliarticligridsourceartiklIdnazivArtiklaDataGrid

于 2013-11-09T19:31:54.793 に答える