问题描述
如何在 Go/Fyne 中向 container.NewGridWithColumns 添加额外的列?
我在 ColumnGrid 中呈现了许多项目(容器)。然后通过一个对话框我想添加一个项目。问题是我找不到扩展原始 ColumnGrid 的方法。
我的代码:
func main() {
a := app.New()
w = a.NewWindow("myApp")
window = container.NewBorder(toolbar(),footer(),nil,content())
w.SetContent(window)
w.ShowAndRun()
}
func content() *fyne.Container {
top := topRow()
bottom := bottomrow()
return container.NewGridWithRows(2,top,bottom)
}
var items []*fyne.Container
func bottomrow() *fyne.Container {
items = nil
db := sql.NewDB()
list,err := db.List()
if err != nil {
//handle error
}
for _,l := range list {
items = append(items,renderChart(l))
}
ct = container.NewGridWithColumns(len(items))
for _,item := range items {
ct.Add(item)
}
return ct
}
func dlgAdd() {
entry := widget.NewEntry()
entry.PlaceHolder = "name"
e := container.NewGridWithRows(2,entry)
d := dialog.NewCustomConfirm(
"Add Item","Add","Cancel",e,func(v bool) {
if !v {
//Cancelled
return
}
if entry.Text == "" {
//without input
return
}
//write entry.Text to db
db := sql.NewDB()
err := db.AddItem(entry.Text)
if err != nil {
return
}
//report succes
i := dialog.Newinformation("Succes",fmt.Sprintf("Item %s added",entry.Text),w)
i.Show()
i.SetonClosed(func() {
问题来了,如何在容器ct中多加一列 然后将对话框中的项目添加到新列 这行不通
ct = container.NewGridWithColumns(len(ct.Objects) + 1)
items = append(items,renderChart(entry.Text))
for _,item := range items {
ct.Add(item)
}
这也行不通
bottomrow()
w.Canvas().Refresh(window)
})
},w)
d.Show()
I am really stuck here.
解决方法
是的,[[ABC,12341,12.20,7.40,100.0,US],[DEF,11134.36,21.00,7.00,US]]
是解决方案,您只需要保存对 Container.Add
的引用而不是创建一个新的引用。
根据 Container
的不同,可能并不总是需要更改它,例如,如果项目数增加,Layout
将继续添加列(因为行数是固定的)。
我找到了解决方案:
ct.Add(newObject)
ct.Layout = (container.NewGridWithColumns(len(ct.Objects))).Layout
ct.Refresh()