Hallo, ich habe das Beispiel nun mal auf aufgebaut wie es bei mir dann in der Realität aussieht, natürlcih habe ich noch viel mehr Spalten, aber das sollte nachher nicht das Problem sein.
Ich denke das Problem liegt daran, dass ich aus zwei Tabellen eine Tabelle forme, welche die Daten der beiden Tabellen hält (soll ja die Hauptübersicht aus dem Datengemenge ein).
Sobald ich das mache, funktioniert die Bindung an das Feld "Anschnittscheibe" nicht mehr, die ComboBox-Items sind immer noch da.
Kann mir jemand sagen, an was es liegt? Muss ich an dem BindigExpression etwas ändern? Anbei noch der Code als ZIP (zuviele Zeichen!!) und ein Bild ...
Bin für jeden Tipp dankbar.
Code Behind (nur ein Ausschnitt), der Rest in der ZIP als Projekt:
/* ==============================================================================================================================*/
public MainWindow_03()
{
InitializeComponent();
//// Tabellenstruktur "Werkzeugdaten" erstellen
TblWerkzeugdaten = new DataTable("");
TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "ID", AutoIncrement = true, AutoIncrementSeed = 1, AutoIncrementStep = 1 });
TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "SapMaterial", DataType = typeof(string) });
TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Nenndurchmesser", DataType = typeof(Single) });
TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Schaftdurchmesser", DataType = typeof(Single) });
TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "Schneidenlaenge", DataType = typeof(Single) });
TblWerkzeugdaten.Columns.Add(new DataColumn() { ColumnName = "HalsVorhanden", DataType = typeof(Boolean) });
//// "Werkzeugdaten" Datensätze manuell zuweisen
TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 3.2, 3.5, 9, true });
TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 3.9, 3.6, 9, true });
TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 3.95, 3.7, 9, true });
TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 4.0, 3.5, 12.2, true });
TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 4.5, 3.9, 12.5, true });
TblWerkzeugdaten.Rows.Add(new object[] { null, "5075777", 4.8, 3.95, 15.1, true });
TblWerkzeugdaten.Rows.Add(new object[] { null, "5075999", 14.5, 13.9, 12.5, false });
TblWerkzeugdaten.Rows.Add(new object[] { null, "5075999", 14.8, 13.95, 15.1, true });
//// Tabellenstruktur "Programminfo" erstellen
TblProgramminfo = new DataTable("");
//tblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "ID", AutoIncrement = true, AutoIncrementSeed = 1, AutoIncrementStep = 1 });
TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "SapMaterial", DataType = typeof(string) });
TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "Anschnittscheibe", DataType = typeof(string) });
TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "RohlingErstellt", DataType = typeof(Boolean) });
TblProgramminfo.Columns.Add(new DataColumn() { ColumnName = "PdfLaderErstellt", DataType = typeof(Boolean) });
//// Der Tabelle Programminfo ein Datensatz zuweisen
TblProgramminfo.Rows.Add(new object[] { "5075777", "7778888", false, true });
TblProgramminfo.Rows.Add(new object[] { "5075999", "8889999", false, true });
//// Gedamte Tabelle organisieren: Alle Spalten der Tabelle Programminfo in die Haupttabelle überführen
TblWerkzeugProgramminfo = TblWerkzeugdaten.Copy();
foreach(DataColumn dtCol in TblProgramminfo.Columns)
{
if (!TblWerkzeugProgramminfo.Columns.Contains(dtCol.ColumnName))
TblWerkzeugProgramminfo.Columns.Add(new DataColumn() { ColumnName = dtCol.ColumnName, DataType = dtCol.DataType});
}
//// Die Daten der beiden Tabellen "Werkzeugdaten" und "Programminfo" programmatisch zusammenführen (Tabelle "WerkzeugProgrammminfo" mit Daten bestücken)
foreach(DataRow rowWerkzeugProgramminfo in TblWerkzeugProgramminfo.Rows)
{
//// Über die SapMaterialspalte werden beide Tabellen abgeglichen
string sapMaterial = rowWerkzeugProgramminfo["SapMaterial"].ToString();
//// Datensatz aus der Tabelle "Programminfo" erfragen, ob es einen Datensatz mit der "SapMaterial" - Nummer gibt, wenn ja dann müssen diese Daten im aktuellen Datensatz eingefügt werden
DataRow rowProgramminfo = TblProgramminfo.AsEnumerable().Where(x => x["SapMaterial"].ToString().Trim() == sapMaterial).FirstOrDefault();
//// Über den Spaltennamen den Ableich der Daten durchführen
if (rowProgramminfo != null)
{
foreach (DataColumn dtColProgramminfo in TblProgramminfo.Columns)
rowWerkzeugProgramminfo[dtColProgramminfo.ColumnName] = rowProgramminfo[dtColProgramminfo.ColumnName];
}
}
//// Tabellenstruktur "Scheibentabelle" erstellen
TblScheibendaten = new DataTable("Scheibendaten");
TblScheibendaten.Columns.Add(new DataColumn() { ColumnName = "SAP-Nummer", DataType = typeof(string) });
TblScheibendaten.Columns.Add(new DataColumn() { ColumnName = "Abmessung", DataType = typeof(string) });
TblScheibendaten.Columns.Add(new DataColumn() { ColumnName = "Standard", DataType = typeof(string) });
TblScheibendaten.Columns.Add(new DataColumn() { ColumnName = "Anwendung", DataType = typeof(string) });
TblScheibendaten.Rows.Add(new object[] { "8318555", "250x16x76,2", "Schneid-Formend", "Anschnitt / Fuehren"});
TblScheibendaten.Rows.Add(new object[] { "8318556", "250x16x76,2", "Schneid-Formend", "Anschnitt / Fuehren" });
TblScheibendaten.Rows.Add(new object[] { "8318557", "250x16x76,2", "Schneid-Formend", "Anschnitt / Fuehren" });
//// Bringt hier nichts, dachte eventuell ...
//TblWerkzeugProgramminfo.AcceptChanges();
//// Gemeinsame Datentabelle "WErkzeugProgramminfo" dem DataGrid mit der DataGridComboBoxColumn anbinden
dg_Daten.ItemsSource = TblWerkzeugProgramminfo.AsDataView();
//// Zur Übersicht die gemeinsame Datentabelle noch in einem eigenen DataGrid anzeigen, zur Kontrolle der Vollständigkeit
dg_DatenOhneComboBox.ItemsSource = TblWerkzeugProgramminfo.AsDataView();
}
/* ==============================================================================================================================*/
private void dg_Daten_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if(e.Column.Header.ToString() == "Anschnittscheibe")
{
e.Column = new DataGridComboBoxColumn
{
Header = "Anschnittscheibe",
ItemsSource = TblScheibendaten.AsDataView(),
DisplayMemberPath = "SAP-Nummer",
//// ==> Lasse ich das frei, klappt die ITEMS-Bindung trotzdem
SelectedValuePath = "",
SelectedValueBinding = new Binding("Anschnittscheibe") { UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged },
};
}
}
/* ==============================================================================================================================*/
}
}