要显示来自F#交互式控制台的数据,我可以执行以下操作:
open System.Windows.Forms
let testgrid (x) =
let form = new Form(Visible = true)
let data = new DataGridView(Dock = DockStyle.Fill)
form.Controls.Add(data)
data.DataSource <- x
testgrid [|(1,1);(2,2)|]
但是如果把上面的内容放在编译的F#程序中并在程序中调用testgrid [|(1,1);(2,2)|]
,我只会得到一个没有数据的冻结窗口。需要做些什么来使这个testgrid
适用于编译的F#程序?
编辑:与ildjarn的回答和一些搜索,以下代码是否正常?任何陷阱?
let testgrid x =
let makeForm() =
use form = new Form()
new DataGridView(Dock = DockStyle.Fill, DataSource = x) |> form.Controls.Add
Application.Run form
let thread = new System.Threading.Thread(makeForm)
thread.SetApartmentState(Threading.ApartmentState.STA)
thread.Start()
答案 0 :(得分:3)
你需要一个消息泵; FSI已经有了一个,这就是为什么你的代码可以在FSI控制台上运行的原因,但是除非你制作一个程序,否则一个独立的程序就没有了:
open System
open System.Windows.Forms
let testgrid x =
use form = new Form()
new DataGridView(Dock = DockStyle.Fill, DataSource = x) |> form.Controls.Add
Application.Run form
[<STAThread>]
do testgrid [|(1,1);(2,2)|]