F# добавить список кнопок в диапазон управления формой

Я создал следующий код в F#:

open System.Drawing
open System.Windows.Forms

let form = new Form(Text="project", TopMost=true, Width=400, Height=400)

let defaultSize = new Size(20,20)

let buttonPos text x y = new Button(Text=text, Top=x, Left=y, Size=defaultSize, BackColor=Color.Aqua)

let gameButtons = [for y in 1..9 do for x in 1..9 -> (buttonPos "X" (x*10) (y*10))]

form.Controls.AddRange (List.toArray(gameButtons))

Я получаю ошибку: Error 1 Type mismatch. Expecting a Control list but given a Button list. The type 'Control' does not match the type 'Button'.

Я также попытался создать gameButtons как массив:

let gameButtons = [|for y in 1..9 do for x in 1..9 -> (buttonPos "X" (x*10) (y*10))|]
form.Controls.AddRange gameButtons

Но это привело к ошибке: Error 1 Type mismatch. Expecting a Control [] but given a Button [] The type 'Control' does not match the type 'Button'

Если у меня есть gameButtons в виде списка и напишите form.Controls.AddRange [| gameButtons.Head |] это работает (но только с одной кнопкой, конечно).

Итак, мой вопрос: почему я не могу добавить такие элементы управления? Как я могу добавить все кнопки в диапазон?

1 ответ

Решение

В этом случае проще использовать последовательности. Вы можете использовать функцию Seq.cast:

open System.Drawing
open System.Windows.Forms

let form = new Form(Text="project", TopMost=true, Width=400, Height=400)

let defaultSize = new Size(20,20)

let buttonPos text x y = new Button(Text=text, Top=x, Left=y, Size=defaultSize, BackColor=Color.Aqua)

let gameButtons = seq{ for y in 1..9 do for x in 1..9 -> (buttonPos "X" (x*10) (y*10)) } |> Seq.cast<Control>

form.Controls.AddRange (Seq.toArray(gameButtons))
Другие вопросы по тегам