F# 在表单控件范围内添加按钮列表

4

我在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))

我遇到了错误:错误1 类型不匹配。期望控件列表但是给出了按钮列表。类型“Control”与类型“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

但是这导致了错误:错误1 类型不匹配。期望控件[],但给定按钮[] 类型“Control”与类型“Button”不匹配

如果我有一个名为gameButtons的列表,并写form.Controls.AddRange [| gameButtons.Head |]它可以工作(但当然只有一个按钮)。

所以我的问题是,为什么我不能像这样添加控件?如何将所有按钮添加到范围内?


4
最简单的解决方案是将buttonPos的定义改为= (new Button (...)) :> Control。问题在于F#没有隐式转换。 - Random Dev
1
@CarstenKönig,隐式转换的缺失不是问题,而是一种解决方案 :-) - Fyodor Soikin
@FyodorSoikin 嗯,在这种情况下,这就是问题。 - Random Dev
谢谢,它完美地工作了! - Sebastian Lindgren
1个回答

3

在这种情况下,使用Sequences更容易。您可以使用函数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))

如果你在倒数第二行不使用 Seq.cast,而是将最后一行改为 form.Controls.AddRange(gameButtons |> Seq.cast |> Seq.toArray),那么类型推断会对你起作用。这样就不需要显式指定 <Control> 了。 - Dax Fohl
谢谢,我尝试了这个方法和Carsten König的代码,它们都很好用! - Sebastian Lindgren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接