JRA-VANからサンプルプログラムとして提供されている出馬表を作成してみます。
出馬表のデータを取得して、表示するプログラムです。
https://jra-van.jp/dlb/sdv/pgm.html#sample
こちらのサンプルはVBで実装されているため、同じような内容の出馬表をC#で作成します。
その1メニュー画面については、以下の記事をご覧ください。
複数のフォームをDIできるようにする
今回のプログラムでは複数のフォームを使用するため、複数のフォームをDIできるようにします。
ファクトリクラスを用意して、フォームのDIを行える仕組みにしました。
using Microsoft.Extensions.DependencyInjection;
namespace JraVanRaceHorseTable
{
public interface IFormFactory
{
TForm Create<TForm>() where TForm : Form;
}
public class FormFactory : IFormFactory
{
private readonly IServiceProvider _services;
public FormFactory(IServiceProvider services)
{
_services = services;
}
public TForm Create<TForm>() where TForm : Form
{
return _services.GetRequiredService<TForm>();
}
}
}
上記のファクトリクラスと今回の出馬表選択画面のフォームをDI設定に追加します。
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
IServiceCollection services = new ServiceCollection();
services.AddDbContext<ApplicationDbContext>();
services.AddTransient<IFormFactory, FormFactory>(); // 追加
services.AddTransient<IRaceService, RaceService>();
services.AddTransient<IRaceUmaService, RaceUmaService>();
services.AddTransient<IUmaService, UmaService>();
services.AddTransient<frmMenu>();
services.AddTransient<frmDenmaList>(); // 追加
ServiceProvider serviceProvider = services.BuildServiceProvider();
frmMenu form = serviceProvider.GetRequiredService<frmMenu>();
Application.Run(form);
}
メニュー画面から出馬表選択画面への遷移を追加
メニュー画面から出馬表選択画面への遷移を追加します。
フォームのコンストラクタに、ファクトリクラスのDIを追加し、「出馬表表示」ボタンをクリックした際に、ファクトリクラスからフォームを生成するようにしています。
namespace JraVanRaceHorseTable
{
public partial class frmMenu : Form
{
private readonly IFormFactory _factory; // 追加
private readonly IRaceService _raceService;
private readonly IRaceUmaService _raceUmaService;
private readonly IUmaService _umaService;
(中略)
public frmMenu(
IFormFactory factory, // 追加
IRaceService raceService,
IRaceUmaService raceUmaService,
IUmaService umaService)
{
InitializeComponent();
_factory = factory; // 追加
_raceService = raceService;
_raceUmaService = raceUmaService;
_umaService = umaService;
}
(中略)
private void btnViewDenmaList_Click(object sender, EventArgs e)
{
var frmDenmaList = _factory.Create<frmDenmaList>(); // 追加
frmDenmaList.txtParam.Text = cmbYear.Text; // 追加
frmDenmaList.Show(); // 追加
}
}
}
出馬表選択画面のフォームを作成する
出馬表選択画面のフォームを作成します。
各項目の名前などは、サンプルプログラムに準ずるものとします。
using JraVanRaceHorseTable.Services;
using static JraVanRaceHorseTable.Const;
namespace JraVanRaceHorseTable
{
public partial class frmDenmaList : Form
{
private readonly IRaceService _raceService;
public frmDenmaList(IRaceService raceService)
{
InitializeComponent();
_raceService = raceService;
}
private void frmDenmaList_Load(object sender, EventArgs e)
{
// 開催年の取得
var year = txtParam.Text[..4];
// 開催月日の取得
var monthDay = txtParam.Text[4..];
var races = _raceService.GetRaceByYearAndMonthDay(year, monthDay);
grdDenmaList.ColumnCount = 3;
grdDenmaList.RowCount = 12;
grdDenmaList.RowHeadersVisible = false;
grdDenmaList.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
grdDenmaList.Columns[0].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
grdDenmaList.Columns[1].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
grdDenmaList.Columns[2].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
grdDenmaList.Columns[0].Width = 500;
grdDenmaList.Columns[1].Width = 500;
grdDenmaList.Columns[2].Width = 500;
var col = 0;
var beforeJyoCd = "";
// ラベルの表示
var clsCodeConv = new ClsCodeConv(Application.StartupPath + "/CodeTable.csv");
var dayOfWeekName = clsCodeConv.GetCodeName(Code.DayOfWeek, races[0].YoubiCD, 2);
lblDenmaList.Text = string.Format(" {0}年{1}月{2}日({3})", year, monthDay[..2], monthDay[2..], dayOfWeekName);
// 出馬表選択一覧の表示
foreach (var r in races)
{
// タイトル行の表示
// 競馬場コードが変わったら次の列をカレント列とする
if (!string.IsNullOrEmpty(beforeJyoCd) && !r.JyoCD.Equals(beforeJyoCd))
{
col++;
}
beforeJyoCd = r.JyoCD;
// 競馬場コードの変換
var raceCourseName = clsCodeConv.GetCodeName(Code.RaceCourse, r.JyoCD, 4);
// 開催回、開催日数ゼロサプレス
var kaiji = r.Kaiji.TrimStart('0');
var nichiji = r.Nichiji.TrimStart('0');
// ヘッダー
grdDenmaList.Columns[col].HeaderText = string.Format("{0} {1}回{2}日", raceCourseName, kaiji, nichiji);
var raceNum = int.Parse(r.RaceNum!.TrimStart('0'));
// [レース番号] [競走名略称6文字][重賞][競走種別][競争条件]
var text1 = string.Format("{0}R {1} {2} {3}",
raceNum.ToString().PadLeft(4),
(r.Ryakusyo6 + GradeCd.GetName(r.GradeCD)).Trim().PadRight(9),
SyubetuCd.GetName(r.SyubetuCD),
JyokenCd.GetName(r.JyokenCD5));
var trackName = clsCodeConv.GetCodeName(Code.Track, r.TrackCD, 2);
var tosu = r.TorokuTosu!.TrimStart('0');
if (DataKind.BreakingNewsCorner.Equals(r.DataKubun)
|| DataKind.Monday.Equals(r.DataKubun))
{
tosu = r.SyussoTosu!.TrimStart('0');
}
// [発走時刻][トラックコード][距離][出走頭数](成績確定までは登録頭数)
var text2 = string.Format("{0}:{1} {2} {3}m {4}頭",
r.HassoTime[..2], r.HassoTime[2..],
trackName.PadRight(18),
r.Kyori,
tosu);
// 表示
grdDenmaList.Rows[raceNum - 1].Cells[col].Value = text1 + "\r\n" + text2;
}
}
private void grdDenmaList_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
}
}
}
サービスクラスには、年と月日を指定して、レース情報を検索できるメソッドを追加しています。
public List<Race> GetRaceByYearAndMonthDay(string year, string monthDay)
{
var races = _db.Races
.Where(r => r.Year == year)
.Where(r => r.MonthDay == monthDay)
.Where(r => !DataKindNarAndOverseas.Contains(r.DataKubun))
.OrderBy(r => r.JyoCD)
.ThenBy(r => r.RaceNum)
.ToList();
return races;
}