| 

.NET C# Java Javascript Exception

0
Hallo Leute

ich bin neu auf .net und WPF und habe nur Erfahrung mit Access Projekt in Verbindung mit SQL Server. Da war es einfach eine Combobox mit fixem Drop-Down-Menü Inhalt an ein Feld auf einer Tabelle zu binden.
In unserem Beispiel geht es darum die "GenderComboBox" mit den einzigen zwei Wörtern "male" und "female" im Drop-Down-Menü, auf das Feld "Gender" der Tabelle "tblCustomer" zu binden.
Im Moment funktioniert das soweit, aber es werden alle "Gender" Inhalte der Datensätze im Drop-Down-Menü angezeigt anstatt wie schon erwähnt, nur die beiden Wörter "male" und "female" welche unabhängig von der Datenbank sein sollten. In der ComboBox1 wäre dies der Fall, aber diese ist nicht an die Datenbank gebunden...
Es wäre toll wenn mir jemand weiterhelfen könnte, ich "brüte" schon seit Wochen über diesem Problem und finde keine Lösung bez. Beispiel im Web für diese Problemstellung, welche doch sehr komun ist.

Besten Dank und schöne Grüsse aus Honduras

Wir haben folgende Tabelle:

USE [Test2]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tblCustomer](
[CustomerID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nchar](20) NULL,
[Gender] [nchar](10) NULL,
CONSTRAINT [PK_tblCustomer] PRIMARY KEY CLUSTERED
(
[CustomerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

und verwenden das Test2DataSet

Class MainWindow 

Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded

Dim Test2DataSet As WpfApplication6.Test2DataSet = CType(Me.FindResource("Test2DataSet"), WpfApplication6.Test2DataSet)
'Load data into the table tblCustomer. You can modify this code as needed.
Dim Test2DataSettblCustomerTableAdapter As WpfApplication6.Test2DataSetTableAdapters.tblCustomerTableAdapter = New WpfApplication6.Test2DataSetTableAdapters.tblCustomerTableAdapter()
Test2DataSettblCustomerTableAdapter.Fill(Test2DataSet.tblCustomer)
Dim TblCustomerViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("TblCustomerViewSource"), System.Windows.Data.CollectionViewSource)
TblCustomerViewSource.View.MoveCurrentToFirst()
End Sub
End Class


und der XAML sieht etwa so aus:

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication6">
<Window.Resources>
<my:Test2DataSet x:Key="Test2DataSet" />
<CollectionViewSource x:Key="TblCustomerViewSource" Source="{Binding Path=tblCustomer, Source={StaticResource Test2DataSet}}" />
</Window.Resources>

<Grid DataContext="{StaticResource TblCustomerViewSource}">
<Grid >
<TextBox Height="23" Name="CustomerIDTextBox" HorizontalAlignment="Left" Margin="114,42,0,246" Text="{Binding Path=CustomerID, Mode=OneWay}"
VerticalAlignment="Center" Width="120" />

<TextBox Height="23" Name="NameTextBox" HorizontalAlignment="Left" Margin="114,70,0,218" Text="{Binding Path=Name, Mode=TwoWay,
ValidatesOnExceptions=true, NotifyOnValidationError=true}" VerticalAlignment="Center" Width="120" />

<ComboBox Height="23" Name="GenderComboBox" DisplayMemberPath="Gender" HorizontalAlignment="Left"
ItemsSource="{Binding}" Margin="114,98,0,190" VerticalAlignment="Center" Width="120"/>

<ComboBox Height="23" Name="ComboBox1" IsEditable="False" Margin="114,127,268,161">
<ComboBoxItem >male</ComboBoxItem>
<ComboBoxItem >female</ComboBoxItem>
</ComboBox>

<Label Content="Name:" HorizontalAlignment="Left" Margin="36,68,0,220" />
<Label Content="CustomerID:" HorizontalAlignment="Left" Margin="36,40,0,248" />
<Label Content="Gender:" HorizontalAlignment="Left" Margin="36,98,0,190" />
</Grid>
</Grid>
</Window>
News:
28.09.2012
eflav 1 1 4
3 Antworten
2
Hallo eflav!

Du wirst für die Items Source eine separate Liste, Collection als Property benötigen die du aus der Datenbank mit eindeutigen Werten befüllst.
Dim _genderList as List<string> = new List<string>();

Nicht auf das dazugehörige Property und das PropertyChanged Event vergessen!

Die Liste befüllst du anschließend mittels der Werte aus der Datenbank
Beispiel Abfrage:
select distinct gender from tblCustomer order by gender asc


Abhängig von der Größe der Tabelle und der verwendeten Indizes kann die Abfrage einige Zeit dauern. Schneller wäre die möglichen Einträge in einer separaten Tabelle (Fremd Schlüssel, Normalisierung beachten) /Resource/XML Datei zu hinterlegen.

Die GenderComboBox wirst du um die folgenden Einträge erweitern müssen:

ItemsSource="{Binding GenderList}" 
DisplayMemberPath="Gender"
SelectedValuePath="Gender"



    ItemsSource bezieht sich auf die Liste mit den erlaubten Werten
    SelectedValuePath auf Test2DataSet.tblCustomers.Gender
    DisplayMemberPath auf Test2DataSet.tblCustomers.Gender


Ich hoffe du kannst mit dem Denkanstoß etwas anfangen
Weiteres Beispiel:
http://social.msdn.microsoft.com/Forums/en/wpf/thread/87abffbf-8e90-40e5-9756-628c28268c31

Anmerkung: Du kannst einen Customer ohne Namen/Geschlecht anlegen! Macht irgendwie keinen Sinn.
29.09.2012
AlexF 81 1
Hallo AlexF

Ich habe nun folgendes gemacht und es funktioniert.

<ComboBox Name="GenderComboBox"
DisplayMemberPath="GenderName"
SelectedValuePath="GenderName"
SelectedValue="{Binding Gender}"/>

Public Sub New()

DataContext = viewModelString
InitializeComponent()

Dim genderTable As DataTable = GetGenderTable()
Dim genderBinding As New Binding() With {.Source = genderTable}
Me.GenderComboBox.SetBinding(ComboBox.ItemsSourceProperty, genderBinding)

End Sub

– Gast 01.10.2012

Private Function GetGenderTable() As DataTable
Dim table As New DataTable("Gender")
table.Columns.Add("GenderName", GetType(String))
table.Rows.Add("male")
table.Rows.Add("female")
Return table
End Function

Das ist eine recht saubere und brauchbare Lösung und wir müssen nicht dem Umweg über irgendwelche Tabellen auf der Datenbank machen.

Besten Dank für den Link!
– Gast 01.10.2012
0
Auf Deine Frage darf es keine Antwort geben, da es sich um einen ganz schlechten Programmierstil handelt.
Deine Anwendung ist nicht wartbar, weiterentwickelbar und nicht testbar.
Die GUI direkt an die Datenbank anzubinden, widerspricht dem fundamentalen Prinzip des Separation of concerns. Eine Grundidee hinter WPF/Silverlight ist daher das Architektur Pattern MVVM, welches dabei hilft, die *Concerns* zu trennen.
Lieder hat MSFT nie die alten Zöpfe der schlechten Programmierung abgeschnitten.
[Böser Kommentar: Na, jetzt schneiden sie ja wohl bald den ganzen WPF Zopf ab]
Gruß
Dirk
04.10.2012
judgy 3,0k 1 1 8
Hallo Dirk

du hast natürlich vollkommen recht, das einfache Beispiel welches ich aus Bequemlichkeit so schnell erstellt hatte, ist in dieser Beziehung hier nicht angebracht. Das Problem wurde aber gelöst und funktioniert auch in einer perfekten Lösung.
Wie wärs mit einem Beitrag deinerseits an dieser Stelle wie es richtig gemacht werden sollte?!
KONSTRUKTIVE Beiträge sind immer Willkommen.
eflav 05.10.2012
0
Hallo eflav,
Dir fehlt als Neuling in einem Forum die Demut.
In dem Du Leute, die Dir antworten, negativ bewertest, wirfst Du Dich aus der Gemeinschaft, bevor Du Du überhaupt angekommen bist.
Gute Reise
Dirk
05.10.2012
judgy 3,0k 1 1 8
Hallo Dirk
du dast nicht unrecht mit deiner Bemerkung.
Ich empfand deinen Beitrag im ersten Moment als nicht positiv/konstuktiv daher die etwas überstürzte Bewertung.
Gruß
eflav 07.10.2012

Stelle deine .net-Frage jetzt!