This question is locked. New answers and comments are not allowed.
Hi There, I'm using the Telerik Datagrid for UWP and it is a pleasure to work with it. I am now developing a datagrid view with several comboboxes to select data from other Lists (Tables in sqlite) and I am struggling with the selected values. I have defined a combobox with the proper data to display but when I select a different record and try to update the change in the record the value is the same as when first initiated. How can i transfer the value? When I use a ordinary combobox the SelectedValuePath and the SelectedValue do the job but this is the datagrid and seems to be different. I searched the net and all questions and also your documentation but didn't find the answer.
Here's some relevant code:
XAML:
<Page
x:Class="GolfComp.Views.TeamListPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:GolfComp.Views"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls"
xmlns:telerikGrid="using:Telerik.UI.Xaml.Controls.Grid"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<RelativePanel>
<CommandBar x:Name="mainCommandBar" HorizontalAlignment="Stretch" IsEnabled="{x:Bind enableCommandBar}">
<AppBarButton
Click="Insert_new_entry"
Icon="Add"
Label="New"
ToolTipService.ToolTip="New record"/>
<AppBarButton
Click="Delete_Click"
Icon="Delete"
Label="Delete"
ToolTipService.ToolTip="Delete record" />
<AppBarButton
Click="UpdateRecord_Click"
Icon="Refresh"
Label="Update"
ToolTipService.ToolTip="Update record" />
</CommandBar>
<StackPanel
x:Name="newRecordStackPanel"
Orientation="Horizontal"
RelativePanel.Below="mainCommandBar">
<ComboBox x:Name="golfclubDropDown" Header="Homeclub" Margin="8,8,16,8" MinWidth="150"/>
<ComboBox x:Name="klasseDropDown" Header="Competitie" Margin="8,8,16,8" MinWidth="150"/>
<TextBox
x:Name="TeamNaamTextBox"
Header="Teamnaam"
PlaceholderText="teamnaam"
Margin="8,8,16,8"/>
<AppBarButton x:Name="DeleteNewRecord" Click="DeleteNewRecord_Click" Icon="Cancel"/>
<AppBarButton x:Name="SaveNewRecord" Click="SaveNewRecord_Click" Icon="Save"/>
</StackPanel>
<telerikGrid:RadDataGrid
AutoGenerateColumns="False"
x:Name="Datagrid"
BorderThickness="0"
ColumnDataOperationsMode="Flyout"
GridLinesVisibility="None"
GroupPanelPosition="Left"
RelativePanel.AlignLeftWithPanel="True"
RelativePanel.AlignRightWithPanel="True"
RelativePanel.Below="newRecordStackPanel"
UserEditMode="Inline"
SelectedItem="{x:Bind SelectedItem, Mode=TwoWay}">
<telerikGrid:RadDataGrid.Columns>
<telerikGrid:DataGridComboBoxColumn PropertyName="Competitie"
Header="Competitie"
ItemsSource="{x:Bind klasse}"
DisplayMemberPath="Competitie"
SelectedValuePath="Klasse_Id" />
<telerikGrid:DataGridNumericalColumn PropertyName="Speler1Id" Header="Speler 1"/>
<telerikGrid:DataGridNumericalColumn PropertyName="Speler2Id" Header="Speler 2"/>
<telerikGrid:DataGridNumericalColumn PropertyName="Speler3Id" Header="Speler 3" />
<telerikGrid:DataGridNumericalColumn PropertyName="Speler4Id" Header="Speler 4" />
<telerikGrid:DataGridNumericalColumn PropertyName="Speler5Id" Header="Speler 5" />
<telerikGrid:DataGridNumericalColumn PropertyName="Speler6Id" Header="Speler 6" />
<telerikGrid:DataGridTextColumn PropertyName="Naam" Header="Teamnaam" />
</telerikGrid:RadDataGrid.Columns>
</telerikGrid:RadDataGrid>
</RelativePanel>
</Grid>
</Page>
C#
namespace GolfComp.Views
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class TeamListPage : Page, INotifyPropertyChanged
{
ObservableCollection<SpelerModel> speler = new ObservableCollection<SpelerModel>();
ObservableCollection<GolfclubModel> golfclub = new ObservableCollection<GolfclubModel>();
ObservableCollection<TeamModel> team = new ObservableCollection<TeamModel>();
ObservableCollection<CoachModel> coach = new ObservableCollection<CoachModel>();
ObservableCollection<KlasseModel> klasse = new ObservableCollection<KlasseModel>();
bool enableCommandBar = true;
public TeamListPage()
{
this.InitializeComponent();
newRecordStackPanel.Visibility = Visibility.Collapsed;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
GetData();
wireUpDropdowns();
if (Datagrid.ItemsSource == null)
{
Datagrid.ItemsSource = team;
}
}
public void GetData()
{
string sql1 = "SELECT * from Speler";
var spelerlijst = SqliteDataAccess.LoadData<SpelerModel>(sql1, new Dictionary<string, object>());
spelerlijst.ForEach(x => speler.Add(x));
string sql2 = "select * from Golfclub";
var golfclublijst = SqliteDataAccess.LoadData<GolfclubModel>(sql2, new Dictionary<string, object>());
golfclublijst.ForEach(x => golfclub.Add(x));
string sql3 = "SELECT Team.Id, KlasseId, Speler1Id, Speler2Id, Speler3Id, Speler4Id, Speler5Id, Speler6Id, Team.Naam, Klasse_Id, Klasse_Naam, Klasse_Omschrijving from Team " +
"INNER JOIN Klasse ON Klasse.Klasse_Id = Team.KlasseId;";
var teamlijst = SqliteDataAccess.LoadData<TeamModel>(sql3, new Dictionary<string, object>());
teamlijst.ForEach(x => team.Add(x));
string sql4 = "select * from Coach";
var coachlijst = SqliteDataAccess.LoadData<CoachModel>(sql4, new Dictionary<string, object>());
coachlijst.ForEach(x => coach.Add(x));
string sql5 = "select * from Klasse";
var klasselijst = SqliteDataAccess.LoadData<KlasseModel>(sql5, new Dictionary<string, object>());
klasselijst.ForEach(x => klasse.Add(x));
}
private void wireUpDropdowns()
{
golfclubDropDown.ItemsSource = golfclub;
golfclubDropDown.DisplayMemberPath = "Naam";
golfclubDropDown.SelectedValuePath = "Id";
klasseDropDown.ItemsSource = klasse;
klasseDropDown.DisplayMemberPath = "Competitie";
klasseDropDown.SelectedValuePath = "Klasse_Id";
}
private void Delete_Click(object sender, RoutedEventArgs e)
{
string sql = "delete from Teams where Id = @Id";
try
{
Dictionary<string, object> parameters = new Dictionary<string, object>
{
{ "@Id", SelectedItem.Id }
};
SqliteDataAccess.DeleteData(sql, parameters);
speler.Clear();
GetData();
}
catch
{
MessageDialog messagedialog = new MessageDialog("Fout: Selecteer een record");
_ = messagedialog.ShowAsync();
return;
}
}
private void UpdateRecord_Click(object sender, RoutedEventArgs e)
{
string sql = "update Team set KlasseId = @KlasseId, Speler1Id = @Speler1Id, Speler2Id = @Speler2Id, " +
"Speler3Id = @Speler3Id, Speler4Id = @Speler4Id, Speler5Id = @Speler5Id, Speler6Id = @Speler6Id, " +
"Naam = @Naam, CoachId = @CoachId, ClubId = @ClubId, PuntenVoor = @PuntenVoor, PuntenTegen = @PuntenTegen " +
"where Id = @Id";
try
{
Dictionary<string, object> parameters = new Dictionary<string, object>
{
{ "@Id",SelectedItem.Id },
{ "@KlasseId", SelectedItem.Klasse_Id },
{ "@Speler1Id", SelectedItem.Speler1Id},
{ "@Speler2Id", SelectedItem.Speler2Id},
{ "@Speler3Id", SelectedItem.Speler3Id},
{ "@Speler4Id", SelectedItem.Speler4Id},
{ "@Speler5Id", SelectedItem.Speler5Id},
{ "@Speler6Id", SelectedItem.Speler6Id},
{ "@Naam", SelectedItem.Naam},
{ "@CoachId", SelectedItem.CoachId},
{ "@ClubId", SelectedItem.ClubId},
{ "@PuntenVoor", SelectedItem.PuntenVoor},
{ "@PuntenTegen", SelectedItem.PuntenTegen}
};
SqliteDataAccess.SaveData(sql, parameters);
speler.Clear();
GetData();
MessageDialog messagedialog = new MessageDialog("Succes: wijzigingen weggeschreven");
_ = messagedialog.ShowAsync();
}
catch (Exception ex)
{
MessageDialog messagedialog = new MessageDialog(ex.Message);
_ = messagedialog.ShowAsync();
return;
}
}
private void Insert_new_entry(object sender, RoutedEventArgs e)
{
enableCommandBar = false;
newRecordStackPanel.Visibility = Visibility.Visible;
}
private void DeleteNewRecord_Click(object sender, RoutedEventArgs e)
{
enableCommandBar = true;
newRecordStackPanel.Visibility = Visibility.Collapsed;
}
private (bool isValid, TeamModel model) ValidateForm()
{
bool isValid = true;
TeamModel model = new TeamModel();
try
{
model.KlasseId = (int)klasseDropDown.SelectedValue;
model.Speler1Id = 0;
model.Speler2Id = 0;
model.Speler3Id = 0;
model.Speler4Id = 0;
model.Speler5Id = 0;
model.Speler6Id = 0;
model.Naam = TeamNaamTextBox.Text;
model.CoachId = 0;
model.ClubId = (int)golfclubDropDown.SelectedValue;
model.PuntenVoor = 0;
model.PuntenTegen = 0;
}
catch
{
isValid = false;
}
return (isValid, model);
}
private void SaveNewRecord_Click(object sender, RoutedEventArgs e)
{
TeamModel model = new TeamModel();
string sql = "insert into Team (KlasseId, Speler1Id, Speler2Id, Speler3Id, Speler4Id, Speler5Id, Speler6Id, Naam, CoachId, ClubId, PuntenVoor, PuntenTegen ) " +
"values (@KlasseId, @Speler1Id, @Speler2Id, @Speler3Id, @Speler4Id, @Speler5Id, @Speler6Id, @Naam, @CoachId, @ClubId, @PuntenVoor, @PuntenTegen)";
var form = ValidateForm();
if (form.isValid == false)
{
MessageDialog messagedialog = new MessageDialog("foutieve invoer. Probeer het opnieuw");
_ = messagedialog.ShowAsync();
return;
}
if (TeamNaamTextBox.Text == "")
{
MessageDialog messagedialog = new MessageDialog("Vul alle velden in");
_ = messagedialog.ShowAsync();
return;
}
Dictionary<string, object> parameters = new Dictionary<string, object>
{
{"@KlasseId", form.model.KlasseId },
{"@Speler1Id", form.model.Speler1Id },
{"@Speler2Id", form.model.Speler2Id },
{"@Speler3Id", form.model.Speler3Id },
{"@Speler4Id", form.model.Speler4Id },
{"@Speler5Id", form.model.Speler5Id },
{"@Speler6Id", form.model.Speler6Id },
{"@Naam", form.model.Naam },
{"@CoachId", form.model.CoachId },
{"@ClubId", form.model.ClubId },
{"@PuntenVoor", form.model.PuntenVoor },
{"@PuntenTegen", form.model.PuntenTegen }
};
SqliteDataAccess.SaveData(sql, parameters);
//speler.Add(form.model);
enableCommandBar = true;
newRecordStackPanel.Visibility = Visibility.Collapsed;
team.Clear();
GetData();
wireUpDropdowns();
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private TeamModel _selectedItem;
public TeamModel SelectedItem
{
get => _selectedItem;
set
{
if (_selectedItem != value)
{
_selectedItem = value;
OnPropertyChanged();
}
}
}
}
}