private void addPlayerToCalculateRating_Click(object sender, RoutedEventArgs e) { //проверка, выбран ли игрок if ((Player)playersList.SelectedItem != null) { //добавляем новую строку и новый столбец var currentRowsCount = resultDataGrid.Items.Count; DataGridTextColumn newColumn = new DataGridTextColumn(); newColumn.Header = (currentRowsCount + 1).ToString(); newColumn.Binding = new Binding(string.Format("[{0}]", 1)); resultDataGrid.Columns.Insert(resultDataGrid.Columns.Count - 4, newColumn); //выделенного игрока сначала добавляем в коллекцию игроков, а потом в DataGrid _playersCollection.Add((Player)playersList.SelectedItem); //Получение и закраска ячеек по диагонали //Получаем строку в виде DataGridRow var row = AccessToCellMethods.GetRow(resultDataGrid, currentRowsCount); // Получаем ячейку в виде DataGridCell var cell = AccessToCellMethods.GetCell(resultDataGrid, row, currentRowsCount + 2); //закрашиваем ячейки cell.Background = Brushes.Black; //ставим ячейки недоступными cell.IsEnabled = false; } else { MessageBox.Show("Не выбран игрок для добавления в расчеты!"); } }
public static void SaveRating(DataGrid resultDataGrid) { try { using (TableTennisContext db = new TableTennisContext()) { // получение количества игроков в расчете рейтинга int currentRowsCount = resultDataGrid.Items.Count; // цикл по списку игроков for (int i = 0; i < currentRowsCount; i++) { DataGridRow currentPlayerRow = AccessToCellMethods.GetRow(resultDataGrid, i); // получение итогового увеличения рейтинга DataGridCell currentPlayerTotalDelta = AccessToCellMethods.GetCell(resultDataGrid, currentPlayerRow, currentRowsCount + 5); double totalDelta = 0; //приведение к типу double totalDelta = double.Parse(currentPlayerTotalDelta.Content.ToString()); object data = currentPlayerRow.Item; // извлекаем его свойства PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(data); // находим свойство "Рейтинг" PropertyDescriptor property = properties["Rating"]; object rating = property.GetValue(data); //добавляем изменение рейтинга в базу Player player = data as Player; player.Rating += totalDelta; db.Entry(player).State = EntityState.Modified; } //сохраняем изменения в базе db.SaveChanges(); MessageBox.Show("Новый рейтинг сохранен в базе!"); } } catch (Exception) { MessageBox.Show("Данные для сохранения не расчитаны! Заполните результаты игр"); } }
public static void CalculateRating(DataGrid resultDataGrid) { // количество игроков, выбранных для расчета рейтинга int currentRowsCount = resultDataGrid.Items.Count; // цикл по списку игроков в расчете рейтинга for (int i = 0; i < currentRowsCount; i++) { double deltaCompetition = 0; double totalDelta = 0; bool isWin = false; //Получаем строку в которой записан текущий игрок var currentPlayerRow = AccessToCellMethods.GetRow(resultDataGrid, i); // цикл по оппонентам текущего игрока for (int j = 0; j < currentRowsCount; j++) { // Получаем значение рейтинга текущего игрока DataGridCell currentPlayerCell = AccessToCellMethods.GetCell(resultDataGrid, currentPlayerRow, j + 2); var currentPlayerRating = AccessToCellMethods.GetPlayerRating(currentPlayerRow, currentPlayerCell); TextBlock text = currentPlayerCell.Content as TextBlock; // Получаем значение рейтинга оппонента var opponentPlayerRow = AccessToCellMethods.GetRow(resultDataGrid, j); var opponentPlayerCell = AccessToCellMethods.GetCell(resultDataGrid, currentPlayerRow, j + 2); var opponentPlayerRating = AccessToCellMethods.GetPlayerRating(opponentPlayerRow, opponentPlayerCell); if (currentPlayerRating != null && opponentPlayerRating != null) { if (text.Text == "") { MessageBox.Show("Заполните результаты игр!"); break; } else if (text.Text == "1") { isWin = true; } else if (text.Text == "0") { isWin = false; } else { MessageBox.Show("Значения могут быть только 1 или 0"); } var delta = RatingCalculation.ToCalculateDelta(currentPlayerRating, opponentPlayerRating, isWin); deltaCompetition += delta; } } // расчета изменения рейтинга по итогам всех встреч double averageDeltaCompetition = deltaCompetition / (currentRowsCount - 1); try { // расчет итогового изменения рейтинга с учетом бонусов и коээфициентов // получение бонуса за место DataGridCell currentPlayerBonusCell = AccessToCellMethods.GetCell(resultDataGrid, currentPlayerRow, currentRowsCount + 2); TextBlock bonus = currentPlayerBonusCell.Content as TextBlock; int bonusForPlace = int.Parse(bonus.Text); // получение коэффициента значимости соревнований DataGridCell currentPlayerKZS = AccessToCellMethods.GetCell(resultDataGrid, currentPlayerRow, currentRowsCount + 3); TextBlock kzsTB = currentPlayerKZS.Content as TextBlock; double kzs = double.Parse(kzsTB.Text, CultureInfo.InvariantCulture); //CultureInfo.InvariantCulture используется для исключения учета формата Double // получение коэффициента за лигу DataGridCell currentPlayerLeagueCoeff = AccessToCellMethods.GetCell(resultDataGrid, currentPlayerRow, currentRowsCount + 4); TextBlock leagueCoeffTB = currentPlayerLeagueCoeff.Content as TextBlock; double leagueCoeff = double.Parse(leagueCoeffTB.Text, CultureInfo.InvariantCulture); //получение и заполнение итогового изменения рейтинга totalDelta = RatingCalculation.ToCalculateTotalDelta(averageDeltaCompetition, bonusForPlace, kzs, leagueCoeff); resultDataGrid.GetCell(currentPlayerRow, currentRowsCount + 5).Content = totalDelta.ToString(); } catch (Exception) { MessageBox.Show("Заполните все поля числовыми данными!!!"); } } }