Wenn du ein DataTable als Source verwendest, wovon ich ausgehe, dann sind die Einträge im Dropdown DataRowView Einträge. Damit könntest du vermutlich so vorgehen:
private void CbRole_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (cbRole.SelectedItem is DataRowView row)
{
var id = row["ID"]?.ToString(); // oder: row.Row["ID"]
var description = row["Description"]?.ToString();
MessageBox.Show($"ID: {id}, Description: {description}");
}
}
Falls du SelectedItem wirklich binden möchtest, brauchen wir sicher ein paar Zusatzinformationen zu der Eigenschaft "ID" die gebunden werden soll. So wie bisher wird das nicht funktionieren:
SelectedItem="{Binding ID, Mode=TwoWay}" SelectedValue="{Binding ID}" SelectedValuePath="{Binding ID}"
Wie hier so oft gepredigt wird, solltest du dem WPF Konzept folgen und mit ViewModels arbeiten. Da ich noch sehr gut weiß, wie verwirrend der Einstieg sein kein, habe ich mir die Zeit genommen, dir ein kleines schnelles Grundgerüst für "RezepteBearbeiten" zu bauen. Möglicherweise erkennst du die Vorteile gegenüber deinem momentanen Stil.
In deinem Code ist bisher niemand zuständig:
<TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" DockPanel.Dock="Bottom" Padding="5,5,5,1"
Width="{TemplateBinding Width}" TextAlignment="Left" FontWeight="Bold"
Text="{TemplateBinding Content, Converter={StaticResource SplitKonv}, ConverterParameter=1}" />
<!-- Resizable Thumb -->
<Thumb Grid.Row="1" Grid.Column="2" Width="5" Cursor="SizeWE"
HorizontalAlignment="Right" Background="Transparent"
DragDelta="Thumb_DragDelta"/>
private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
{
if (sender is Thumb thumb && thumb.TemplatedParent is GridViewColumnHeader header)
{
if (header.Column != null)
{
double newWidth = header.Column.Width + e.HorizontalChange;
header.Column.Width = Math.Max(newWidth, 20); // Mindestbreite setzen
}
}
}
Moin,
ich gehe üblicherweise den Weg, die Eingabe über einen zusätzlichen Dialog anzubieten. Möglicherweise ist das auch eine Alternative für dich.
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Style="{StaticResource FormTextBlockStyle}" Text="{Binding Note}" TextAlignment="Left" HorizontalAlignment="Left"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<DockPanel LastChildFill="True">
<Button Content="Bearbeiten" Margin="0,0,4,0" Command="{Binding EditNoteCommand}"/>
<TextBlock HorizontalAlignment="Left" TextAlignment="Left" VerticalAlignment="Center" Style="{StaticResource FormTextBlockStyle}" Text="{Binding Note}" />
</DockPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
Solltest du bei deinem Vorhaben bleiben wollen, musst du dich ein wenig mit den DataGridCell - Events und dem Stichwort "Eingabefokus" beschäftigen.
<Popup
IsOpen="{Binding IsSelected, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}}"
Placement="MousePoint"
StaysOpen="False">
<TextBox
Width="300"
Height="200"
AcceptsReturn="True"
Text="{Binding Note}" />
Das würde mich ebenfalls interessieren, passierte öfter in den letzten Wochen. Lösung bisher war das Löschen der [obj] und [bin] Ordner mit anschließender Projekt Neuerstellung.
Schau dir die GroupName Property an.
Ich verstehe nicht ganz was du vorhast, aber vermutlich dies:
string name = null;
string pass =null;
foreach (DataRow datarow in table.Rows)
{
name= datarow["Benutzername"].ToString();
pass = datarow["Passwort"].ToString();
if (name.Contains(Txt_Benutzername.Text) && pass.Contains(Txt_Passwort.Text))
{
MessageBox.Show("Klappt");
}
else
{
MessageBox.Show("Klappt nicht");
}
}
Nicht einfach aufgeben 🙂
Die DataGrid Eigenschaft AutoGenerateColumns sollte das erste Problem lösen.
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding ProjektUmsatzTabelle}"/>
Diese kannst du natürlich auch so setzen:
Dtg_Umsatzvorschau.AutoGenerateColumns=false;
Dtg_Umsatzvorschau.ItemsSource = ProjektUmsatzTabelle;
Formatierung:
Standard numeric format strings
Wenn du das erledigt hast, ist dies eine Variante für das nächste Problem:
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</DataGrid.ColumnHeaderStyle>
Du solltest neben all dem aber versuchen zu verstehen, warum deine Bindung in XAML nicht klappt, die im Codebehind jedoch schon.
<DataGrid ItemsSource="{Binding Path=TestViewModel.ProjektUmsatzTabelle}"/>
Du bindest damit bereits an die Auflistung deines Typs "Jahrestabelle".
Analog zu Th69´s Vorgehen sollte es dann so in etwa gehen:
...
Spalte = new DataGridTextColumn() { Header = "Kunde", Binding = new Binding("Kunde") };
Spalte = new DataGridTextColumn() { Header = "Projekt", Binding = new Binding("Projekt") };
...
for (int j = ProgStartJahr; j ≤ ProgEndJahr; j++)
{
Spalte = new DataGridTextColumn()
{
Header = j,
Binding = new Binding(string.Format("[{0}].Volumen", j - ProgStartJahr))
};
Dgd_Umsatzvorschau.Columns.Add(Spalte);
}
Ich verstehe immer noch nicht ganz wie das aussehen soll, aber mein erster Gedanke ging in diese Richtung (vor meinem eigentlichen Job schnell getippt 🙂
public class JahresTabelle : ObservableCollection<VolumeDetail>
{
public JahresTabelle(string kunde, string projectName)
{
Kunde = kunde;
ProjektName = projectName;
}
public string Kunde { get; set; }
public string ProjektName { get; set; }
}
public class VolumeDetail
{
public VolumeDetail(int jahr, double[] volumen)
{
Jahr = jahr;
Volumen = volumen.ToList();
Summe = Volumen == null ? 0 : Summe = Volumen.Sum();
}
public int Jahr
{ get; private set; }
public List<double> Volumen
{ get; private set; }
public double Summe
{ get; private set; }
}
Random random = new Random();
var projektBezeichnungsTabelle = new List<JahresTabelle>();
var progStartJahr = 2022;
var progEndJahr = 2030;
//erstellt 50 Kunden mit einem Projekt
for (int tempID = 0; tempID < 50; tempID++)
{
var data = new JahresTabelle("Kunde" + tempID, "Projekt" + tempID);
for (int jahr = progStartJahr; jahr < progEndJahr; jahr++)
{
var volumesOfYear = new double[]
{
random.NextDouble(),
random.NextDouble(),
random.NextDouble(),
};
data.Add(new VolumeDetail(jahr, volumesOfYear));
}
projektBezeichnungsTabelle.Add(data);
}
//create columns
DataGridTextColumn column;
var columnCollection = new List<DataGridTextColumn>();
{
//kunde
column = new DataGridTextColumn()
{
Header = "Kunde",
Binding = new Binding("Kunde")
};
columnCollection.Add(column);
//projekt
column = new DataGridTextColumn()
{
Header = "ProjektName",
Binding = new Binding("ProjektName")
};
columnCollection.Add(column);
//dynamic year columns
for (int j = progStartJahr; j < progEndJahr; j++)
{
column = new DataGridTextColumn()
{
Header = "Vol. im Jahr " + j,
Binding = new Binding(string.Format("[{0}].Jahr.Summe", j - progStartJahr))
};
columnCollection.Add(column);
}