如何向容器中添加额外的列。Go/Fyne中的NewGridWithColumns?
我在ColumnGrid中呈现了许多项目(容器(。然后通过一个对话框,我想添加一个项目。问题是我找不到扩展原来ColumnGrid的方法。
我的代码:
func main() {
a := app.New()
w = a.NewWindow("myApp")
window = container.NewBorder(toolbar(), footer(), nil, 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.
我找到了解决方案:
ct.Add(newObject)
ct.Layout = (container.NewGridWithColumns(len(ct.Objects))).Layout
ct.Refresh()
是的,Container.Add
就是解决方案,您只需要保存对Container
的引用,而不需要创建新的引用。根据Layout
,可能并不总是需要更改它,例如,如果项目数量增加(因为行数是固定的(,GridWithRows(...)
将继续添加列。