예제 #1
0
        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("Заполните все поля числовыми данными!!!");
                }
            }
        }