private void ReloadTable() { var groupName = GroupName; var matchId = MatchId; LockControl(); var everyGroupNum = MatchGroupTableDAL.GetFinalColumnCountSelected(matchId, GroupName, SexName); if (string.IsNullOrWhiteSpace(everyGroupNum)) { // 初始化每组人数 this.cbEveryGroupNum.SelectedItem = "4"; this.menDataView.DataSource = null; UnLockControl(); return; } var columnCount = 0; columnCount = Convert.ToInt32(everyGroupNum); // 获取选择组别、项目下的所有运动员信息 var allAthletes = Athletes.Select(x => new MatchGroupTableAthleteModel() { Name = x.Name, TeamName = x.TeamName, TeamShortName = x.TeamShortName }).ToList(); // 设置分组,同单位的不同列,不同行,只参加个人赛的需要标注 var rowCount = (int)Math.Ceiling(allAthletes.Count / (decimal)columnCount); // 需要的组数 var table = MatchGroupTableDAL.GetFinalEveryGroupTable(matchId, groupName, SexName); DisplayInScreen(rowCount, columnCount, table); }
private void lbGenerateMatchGroup_Click(object sender, EventArgs e) { var everyGroupNum = this.cbEveryGroupNum.SelectedItem?.ToString(); if (string.IsNullOrWhiteSpace(everyGroupNum)) { MessageBox.Show("请先定义每组人数, 再生成竞赛分组表"); return; } var columnCount = 0; columnCount = Convert.ToInt32(everyGroupNum); // 获取选择组别、项目下的所有运动员信息 var allAthletes = Athletes.Select(x => new MatchGroupTableAthleteModel() { Name = x.Name, TeamName = x.TeamName, TeamShortName = x.TeamShortName }).ToList(); // 设置分组,同单位的不同列,不同行,只参加个人赛的需要标注 var rowCount = (int)Math.Ceiling(allAthletes.Count / (decimal)columnCount); // 需要的组数 var newAthletes = new List <MatchGroupTableAthleteModel>(); allAthletes.ForEach(i => newAthletes.Add(i)); // 排序结果: // 1. 同组人员尽可能分为上下两区 // 2. 同组人员不同行不同列 // 3. 如果人还多,则同列,按照同每列人数从2开始逐渐递增,直至没有多余的列或者最大列数 // 4. 如果人还多便可以同行,同行人数最大每行容纳每组人数两人,否则报错 // 对当前的运动员信息按照每队的人数从大到小进行排序, 如果人数最大的组的数目 > 2 * 组数,提示报错,每组不该超过两人该队人员 // 遍历每一只队伍,进行三轮排序直到该队伍人数排完为止 // 第一轮,不同行,不同列,行 + 列,最小/最大位置切换填充人员 // 第二轮,不同行,同列,行 + 列,最小/最大位置切换填充人员(每列人数从2~总行数) // 第三轮, 不同列同行数不超过2人,行 + 列,最小/最大位置切换填充人员,遇到行 + 列数目相同的单元格,选择列中同队人员最小的一个 // 按队伍人数从多到少的排序 var allSortedTeamNames = GetAllSortedTeamNames(newAthletes, rowCount, SexName); // 初始化一个竞赛分组表 var table = GenerateMatchTable(rowCount, columnCount); // 对每一只队伍进行排序 for (var i = 0; i < allSortedTeamNames.Count; i++) { var willSortedAthletes = newAthletes.Where(x => x.TeamName == allSortedTeamNames[i]).ToList(); SortEveryTeamAthletes(table, willSortedAthletes); } // 展示到界面上 DisplayInScreen(rowCount, columnCount, table); #region 将生成的分组竞赛表存入到DB中 MatchGroupTableDAL.InsertFinalMatchGroupTableBatch(MatchId, table, SexName, GroupName, everyGroupNum); #endregion LockControl(); }
private void lbPrintMatchGroup_Click(object sender, EventArgs e) { // 生成报表 var fileName = $"{MatchName}-{GroupName}-{Project}-决赛竞赛分组表-{DateTime.Now.ToString("yyyyMMddHHmmss")}"; var table = MatchGroupTableDAL.GetFinalEveryGroupTable(MatchId, GroupName, SexName); ExcelHelperMatchGroup.GenerateOneSexMatchGroup(fileName, MatchId, MatchName, GroupName, SexName, table); }
private void cbGroupNames_SelectedIndexChanged(object sender, EventArgs e) { var groupName = this.cbGroupNames.SelectedItem?.ToString(); if (string.IsNullOrWhiteSpace(groupName)) { return; } var matchId = MatchId; var columnSelected = MatchGroupTableDAL.GetColumnCountSelected(matchId, groupName); if (columnSelected.Length == 0) { // 初始化男子,女子个人团体每组人数 this.cbMenAndWomenEveryGroupNum.SelectedItem = "4"; // 初始化双打每组人数 this.cbDoubleEveryGroupNum.SelectedItem = "3"; this.menDataView.DataSource = null; this.WomenDataView.DataSource = null; this.menmenDataView.DataSource = null; this.womenWomenDataView.DataSource = null; this.menWomenDataView.DataSource = null; UnLockControl(); return; } LockControl(); var menWomenColumn = columnSelected[0]; var doubleColumn = columnSelected[1]; this.cbMenAndWomenEveryGroupNum.SelectedItem = menWomenColumn; this.cbDoubleEveryGroupNum.SelectedItem = doubleColumn; var allSex = MatchGroupTableDAL.GetAllProjectsByGroup(matchId, groupName); // 男,女,男男,女女,男女 foreach (var sexName in allSex) { var columnCount = 0; if (sexName == "男" || sexName == "女") { columnCount = Convert.ToInt32(menWomenColumn); } else if (sexName == "男男" || sexName == "女女" || sexName == "男女") { columnCount = Convert.ToInt32(doubleColumn); } // 获取选择组别、项目下的所有运动员信息 var allAthletes = MatchGroupTableDAL.GetAllAthletesByGroupProject(matchId, groupName, sexName); // 设置分组,同单位的不同列,不同行,只参加个人赛的需要标注 var rowCount = (int)Math.Ceiling(allAthletes.Count / (decimal)columnCount); // 需要的组数 var table = MatchGroupTableDAL.GetEveryGroupTable(matchId, groupName, sexName); DisplayInScreen(rowCount, columnCount, sexName, table); } }
private void menDataView_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (this.lbGenerateMatchGroup.Enabled) { var row = e.RowIndex; var column = e.ColumnIndex; var groupName = GroupName; var matchId = MatchId; var value = this.menDataView.Rows[row].Cells[column].Value.ToString(); MatchGroupTableDAL.UpdateFinalCellNameTeamName(matchId, groupName, SexName, row, column - 1, value); } }
private void lbGenerateRecordCard_Click(object sender, EventArgs e) { var groupName = GroupName; var matchId = MatchId; var matchName = MatchName; var allSex = MatchGroupTableDAL.GetAllProjectsByGroup(matchId, groupName); // 男,女,男男,女女,男女 // 不同性别打印不同的记杆卡,同一性别打印在一个Excle中 var table = MatchGroupTableDAL.GetFinalEveryGroupTable(matchId, groupName, SexName); var gName = SwitchSexName(SexName); var fileName = $"{matchName}-{groupName}-{gName}-记杆卡-{DateTime.Now.ToString("yyyyMMddHHmmss")}"; ExcelHelperMatchGroup.GenerateRecoredCard(fileName, matchId, matchName, groupName, SexName, table); }
private void womenWomenDataView_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (this.lbGenerateMatchGroup.Enabled) { var row = e.RowIndex; var column = e.ColumnIndex; var groupName = this.cbGroupNames.SelectedItem.ToString(); var matchId = MatchId; var value = this.womenWomenDataView.Rows[row].Cells[column].Value.ToString(); string name, teamShortName; GetNameAndTeamShortName(value, out name, out teamShortName); MatchGroupTableDAL.UpdateCellNameTeamName(matchId, groupName, "女女", row, column - 1, name, teamShortName); } }
private void GenerateMatchGroup_Load(object sender, EventArgs e) { asc.Initialize(this); // 初始化男子,女子个人团体每组人数 this.cbMenAndWomenEveryGroupNum.SelectedItem = "4"; // 初始化双打每组人数 this.cbDoubleEveryGroupNum.SelectedItem = "3"; // 初始化组别选择 var allGroups = MatchGroupTableDAL.GetAllGroups(MatchId); this.cbGroupNames.DataSource = allGroups; }
private void RecordScore_Load(object sender, EventArgs e) { // 修改人员的button是否显示 if (RecordByGroup) { this.lbAddAthlete.Visible = false; this.lbDelete.Visible = false; } // 初始化组别选择 var allGroups = MatchGroupTableDAL.GetAllGroups(MatchId); this.cbGroupNames.DataSource = allGroups; // 初始化项目 var projects = new string[] { "男子组", "女子组", "混双", "男双", "女双" }; this.cbProjectNames.DataSource = projects; // 初始化比赛信息 var matchInfo = MatchDAL.GetMatchInfoById(MatchId); MatchInfo = matchInfo; // 初始化轮数 var rounds = new List <int>(); for (int i = 1; i <= MatchInfo.PreRounds; i++) { rounds.Add(i); } this.cbRounds.DataSource = rounds; var preFinal = new List <string>() { "预赛", "决赛" }; this.cbPreFinal.DataSource = preFinal; SetTable(IsFinal); }
public static void GenerateMatchGroup(string fileName, string matchId, string matchName, string groupName) { IWorkbook workbook = null; ISheet sheet; string path; workbook = InitialExcelSheet(fileName, workbook, out sheet, out path); // 设置每列宽度 sheet.SetColumnWidth(0, 3500); sheet.SetColumnWidth(1, 3500); sheet.SetColumnWidth(2, 3500); sheet.SetColumnWidth(3, 3500); sheet.SetColumnWidth(4, 3500); sheet.SetColumnWidth(5, 3500); var row = 0; // 设置文档表头 row = SetTableHeader(workbook, sheet, row, $"竞赛分组表", 450); var allSex = MatchGroupTableDAL.GetAllProjectsByGroup(matchId, groupName); // 男,女,男男,女女,男女 foreach (var sexName in allSex.Distinct()) { var sName = SwitchSexName(sexName); // 设置表名 row = SetTableHeader(workbook, sheet, row, $"{matchName}{sName}分组表"); var table = MatchGroupTableDAL.GetEveryGroupTable(matchId, groupName, sexName); if (table.Count == 0) { continue; } var column = table.Max(x => x.Column) + 1; // 设置表头 row = SetColumnHeader(workbook, sheet, row, column); // 设置每行人数 var maxRow = table.Max(x => x.Row); for (var i = 0; i < maxRow + 1; i++) { var athletesRow = CreateRow(sheet, row); var rowHeaderCell = SetCellValue(athletesRow, 0, $"第 {i + 1} 组"); rowHeaderCell.CellStyle = SetCellStyle(workbook, sheet, row, needBorder: true); var athletes = table.Where(x => x.Row == i).OrderBy(x => x.Column).ToList(); for (var j = 0; j < athletes.Count; j++) { var cell = SetCellValue(athletesRow, j + 1, $"{athletes[j].Name} \n {athletes[j].TeamShortName}"); cell.CellStyle = SetCellStyle(workbook, sheet, row, needBorder: true); if (athletes[j].IsIndividualGroupMatch && (sexName == "男" || sexName == "女")) { SetCellValue(athletesRow, j + 1, $"{athletes[j].Name} \n {athletes[j].TeamShortName} ■"); } } ++row; } } using (FileStream fileStream1 = File.OpenWrite(path)) { workbook.Write(fileStream1); } StringBuilder sb = new StringBuilder(); sb.AppendLine("报表已生成"); sb.AppendLine($"路径:{Path.GetDirectoryName(path)}"); sb.AppendLine($"报表文件:{fileName}.xlsx"); MessageBox.Show(sb.ToString(), "提示"); // 打开生成的报表 System.Diagnostics.Process.Start(path); }
private void LoadAthletes(DataTable table, string matchId, string groupName, string sexName, int round, bool isFinal) { // 决赛 if (isFinal) { // 决赛的时候,取出成绩的前几名显示,前几名在创建比赛的时候设定 var showNum = MatchInfo.FinalNum; // 获取几轮杆数的排序 var preRound = MatchInfo.PreRounds; var athletesScore1 = AthletesDAL.GetAthletesScore(matchId, groupName, sexName, preRound); athletesScore1 = athletesScore1.Where(x => x.ScoresWithRound.Count > 0).OrderBy(x => x.SumSocre).Take(showNum).ToList(); if (RecordByGroup) { // 判断是否已经生成分组表,如果没有则提示先生成分组表 var finalMatchGroupGenerate = MatchGroupTableDAL.FinalMatchGroupGenerated(matchId, groupName, sexName); if (!finalMatchGroupGenerate) { MessageBox.Show($"{groupName}-{sexName}-决赛分组表还未生成,请先生成决赛分组表后再通过分组表录入分数"); return; } var roundField = ConvertRoundToDBField(round, isFinal); var athletesScore = AthletesDAL.GetAthletesScore(matchId, groupName, sexName, roundField); // 更新每条数据在group table的位置 MatchGroupTableDAL.UpdateFinalGroupTableInfo(matchId, groupName, sexName, athletesScore); athletesScore = athletesScore.OrderBy(x => x.Row).ThenBy(x => x.Column).ToList(); for (var i = 0; i < athletesScore.Count; i++) { var row = table.NewRow(); row[0] = $"第{athletesScore[i].Row + 1}组"; row[1] = athletesScore[i].TeamShortName; row[2] = athletesScore[i].Name; var sum = 0.0; if (athletesScore1.Select(x => x.TeamShortName).Contains(athletesScore[i].TeamShortName) && athletesScore1.Select(x => x.Name).Contains(athletesScore[i].Name)) { if (athletesScore[i].Score.Count > 1) { var j = 3; foreach (var s in athletesScore[i].Score) { row[j] = s.Value; var value = 0.0; Double.TryParse(s.Value, out value); sum += value; j++; } row[3 + athletesScore[i].Score.Count] = sum; } table.Rows.Add(row); } } } else { var roundField = ConvertRoundToDBField(round, isFinal); var athletesScore = AthletesDAL.GetAthletesScore(matchId, groupName, sexName, roundField); athletesScore = athletesScore.OrderBy(x => x.TeamName).ThenBy(x => x.Name).ToList(); for (var i = 0; i < athletesScore.Count; i++) { var row = table.NewRow(); row[0] = athletesScore[i].TeamShortName; row[1] = athletesScore[i].Name; var sum = 0.0; if (athletesScore1.Select(x => x.TeamShortName).Contains(athletesScore[i].TeamShortName) && athletesScore1.Select(x => x.Name).Contains(athletesScore[i].Name)) { if (athletesScore[i].Score.Count > 1) { var j = 2; foreach (var s in athletesScore[i].Score) { row[j] = s.Value; var value = 0.0; Double.TryParse(s.Value, out value); sum += value; j++; } row[2 + athletesScore[i].Score.Count] = sum; } table.Rows.Add(row); } } } } else // 预赛 { var roundField = ConvertRoundToDBField(round, isFinal); var athletesScore = AthletesDAL.GetAthletesScore(matchId, groupName, sexName, roundField); if (RecordByGroup) { // 更新每条数据在group table的位置 MatchGroupTableDAL.UpdateGroupTableInfo(matchId, groupName, sexName, athletesScore); athletesScore = athletesScore.OrderBy(x => x.Row).ThenBy(x => x.Column).ToList(); } else { athletesScore = athletesScore.OrderBy(x => x.TeamShortName).ThenBy(x => x.Name).ToList(); } for (var i = 0; i < athletesScore.Count; i++) { var row = table.NewRow(); if (RecordByGroup) { row[0] = $"第{athletesScore[i].Row + 1}组"; row[1] = athletesScore[i].TeamShortName; row[2] = athletesScore[i].Name; var sum = 0.0; if (athletesScore[i].Score.Count > 1) { var j = 3; foreach (var s in athletesScore[i].Score) { row[j] = s.Value; var value = 0.0; Double.TryParse(s.Value, out value); sum += value; j++; } row[3 + athletesScore[i].Score.Count] = sum; } } else { row[0] = athletesScore[i].TeamShortName; row[1] = athletesScore[i].Name; var sum = 0.0; if (athletesScore[i].Score.Count > 1) { var j = 2; foreach (var s in athletesScore[i].Score) { row[j] = s.Value; var value = 0.0; Double.TryParse(s.Value, out value); sum += value; j++; } row[2 + athletesScore[i].Score.Count] = sum; } } table.Rows.Add(row); } } }
private void lbGenerateMatchGroup_Click(object sender, EventArgs e) { var doubleColumn = this.cbDoubleEveryGroupNum.SelectedItem?.ToString(); var menWomenColumn = this.cbMenAndWomenEveryGroupNum.SelectedItem?.ToString(); var groupNameSelected = this.cbGroupNames.SelectedItem?.ToString(); if (string.IsNullOrWhiteSpace(doubleColumn) || string.IsNullOrWhiteSpace(groupNameSelected) || string.IsNullOrWhiteSpace(menWomenColumn)) { MessageBox.Show("请先定义组别, 男子女子个人团体每组人数,双打每组人数, 再生成竞赛分组表"); return; } var groupName = groupNameSelected; var allSex = MatchGroupTableDAL.GetAllProjectsByGroup(MatchId, groupNameSelected); // 男,女,男男,女女,男女 // 根据不同的sexName生成不同的竞赛分组表 foreach (var sexName in allSex) { var columnCount = 0; if (sexName == "男" || sexName == "女") { columnCount = Convert.ToInt32(menWomenColumn); } else if (sexName == "男男" || sexName == "女女" || sexName == "男女") { columnCount = Convert.ToInt32(doubleColumn); } // 获取选择组别、项目下的所有参加杆数赛的运动员信息 var allAthletes = MatchGroupTableDAL.GetAllAthletesByGroupProject(MatchId, groupName, sexName); if (allAthletes.Count == 0) { continue; } // 设置分组,同单位的不同列,不同行,只参加个人赛的需要标注 var rowCount = (int)Math.Ceiling(allAthletes.Count / (decimal)columnCount); // 需要的组数 var newAthletes = new List <MatchGroupTableAthleteModel>(); allAthletes.ForEach(i => newAthletes.Add(i)); // 排序结果: // 1. 同组人员尽可能分为上下两区 // 2. 同组人员不同行不同列 // 3. 如果人还多,则同列,按照同每列人数从2开始逐渐递增,直至没有多余的列或者最大列数 // 4. 如果人还多便可以同行,同行人数最大每行容纳每组人数两人,否则报错 // 对当前的运动员信息按照每队的人数从大到小进行排序, 如果人数最大的组的数目 > 2 * 组数,提示报错,每组不该超过两人该队人员 // 遍历每一只队伍,进行三轮排序直到该队伍人数排完为止 // 第一轮,不同行,不同列,行 + 列,最小/最大位置切换填充人员 // 第二轮,不同行,同列,行 + 列,最小/最大位置切换填充人员(每列人数从2~总行数) // 第三轮, 不同列同行数不超过2人,行 + 列,最小/最大位置切换填充人员,遇到行 + 列数目相同的单元格,选择列中同队人员最小的一个 // 按队伍人数从多到少的排序 var allSortedTeamNames = GetAllSortedTeamNames(newAthletes, rowCount, sexName); // 初始化一个竞赛分组表 var table = GenerateMatchTable(rowCount, columnCount); // 对每一只队伍进行排序 for (var i = 0; i < allSortedTeamNames.Count; i++) { var willSortedAthletes = newAthletes.Where(x => x.TeamName == allSortedTeamNames[i]).ToList(); SortEveryTeamAthletes(table, willSortedAthletes); } // 展示到界面上 DisplayInScreen(rowCount, columnCount, sexName, table); #region 将生成的分组竞赛表存入到DB中 MatchGroupTableDAL.InsertMatchGroupTableBatch(MatchId, table, sexName, groupName, Convert.ToInt32(menWomenColumn), Convert.ToInt32(doubleColumn)); #endregion } LockControl(); }