2025/06/12

Win UI3でのDataGrid定義

Windowsフォームアプリでは

var columnNames = new string[]
{
    "umaban", "bamei", "kishu", "choukyosi", "tansho", "fukusho", "bataijyu", "mark", "chaku"
};
var columnHeader = new string[]
{
    "馬番", "馬名", "騎手", "調教師", "単勝", "複勝", "馬体重", "印", "着順"
};
var columnWidth = new int[]
{
    30, 201, 88, 88, 60, 130, 60, 30, 30
};

for (int i = 0; i < columnNames.Length; i++)
{
    DataGridViewColumn tbCol = new DataGridViewTextBoxColumn();
    tbCol.Name = columnNames[i];
    tbCol.HeaderText = columnHeader[i];
    tbCol.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
    tbCol.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
    tbCol.ReadOnly = true;
    tbCol.SortMode = DataGridViewColumnSortMode.NotSortable;

    dgv.Columns.Add(tbCol);
    dgv.Columns[columnNames[i]].Width = columnWidth[i];
}

って感じでC#で定義してたりしました。素人的にWin UI3でデータグリッド使うにはxamlで

<Grid Grid.Row="1">
    <controls:DataGrid x:Name="RaceDetailGrid"
                    AutoGenerateColumns="False" HeadersVisibility="Column"
                    CanUserResizeColumns="False" SelectionMode="Single" RowHeight="30" CanUserSortColumns="False"
                    >
    <controls:DataGrid.Columns>
        <controls:DataGridTextColumn Header="馬番" Binding="{Binding Umaban}" Width="60"/>
        <controls:DataGridTextColumn Header="馬名" Binding="{Binding Bamei}" Width="200"/>
        <controls:DataGridTextColumn Header="服" Binding="{Binding Fuku}" Width="80"/>
        <controls:DataGridTextColumn Header="騎手" Binding="{Binding Kishu}" Width="120"/>
        <controls:DataGridTextColumn Header="調教師" Binding="{Binding Chokyosi}" Width="120"/>
        <controls:DataGridTextColumn Header="単勝" Binding="{Binding Tansho}" Width="80"/>
        <controls:DataGridTextColumn Header="複勝" Binding="{Binding Fukusho}" Width="140"/>
        <controls:DataGridTextColumn Header="馬体重" Binding="{Binding Bataiju}" Width="100"/>
        <controls:DataGridTextColumn Header="印" Binding="{Binding Mark}" Width="60"/>
        <controls:DataGridTextColumn Header="着順" Binding="{Binding Chaku}" Width="80"/>
    </controls:DataGrid.Columns>
    </controls:DataGrid>
</Grid>

としてみてたのですが、今後こんなの増えてくるとってのと今回カスタム列タイプも試したのでその為にもスマートに定義が出来ればと思い、Copilotに質問ぶつけて得た方法は

public class DataGridColumnDefinition
{
    public string Header { get; set; }
    public string BindingPath { get; set; }
    public int Width { get; set; }
    public string ColumnType { get; set; } // 列の種類を文字列で管理
}

として定義用クラスを用意し、

private void DesignRaceDetailGrid(DataGrid dataGrid)
{
    var columnDefinitions = new List<DataGridColumnDefinition>
    {
        new DataGridColumnDefinition { Header = "馬番", BindingPath = "Umaban", Width = 60, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "馬名", BindingPath = "Bamei", Width = 200, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "服", BindingPath = "Fuku", Width = 80, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "騎手", BindingPath = "Kishu", Width = 120, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "調教師", BindingPath = "Chokyosi", Width = 120, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "単勝", BindingPath = "Tansho", Width = 80, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "複勝", BindingPath = "Fukusho", Width = 140, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "馬体重", BindingPath = "Bataiju", Width = 100, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "印", BindingPath = "Mark", Width = 60, ColumnType = "Text" },
        new DataGridColumnDefinition { Header = "着順", BindingPath = "Chaku", Width = 60, ColumnType = "Text" },
    };

    foreach (var column in columnDefinitions)
    {
        DataGridColumn dataGridColumn;
        switch (column.ColumnType)
        {
            case "Text":
                dataGridColumn = new DataGridTextColumn
                {
                    Header = column.Header,
                    Binding = new Binding { Path = new PropertyPath(column.BindingPath) },
                    Width = new DataGridLength(column.Width, DataGridLengthUnitType.Pixel)
                };
                break;

            default:
                    throw new InvalidOperationException($"未対応の列タイプ: {column.ColumnType}");
        }

        dataGrid.Columns.Add(dataGridColumn);
    }
}

定義しやすさとメンテしやすさと思ってしてみました。

0 件のコメント:

コメントを投稿