如何解决通过XML动态生成的按钮始终具有与XML文件中最后一个节点相同的属性
使用以下功能,将基于现有XML文档将一系列按钮生成到流布局面板中。 该函数在程序加载时被调用,并成功生成具有不同属性的按钮,直到单击它们为止。 单击按钮时,它们应将其属性输出到数据网格视图面板,但仅输入XML文档中最后一个节点的属性。
Function loadMenuItems() As Double
m_xmld = New XmlDocument
m_xmld.Load("Menu.xml")
m_nodelist = m_xmld.GetElementsByTagName("menuItems")
For Each m_node In m_nodelist
Dim newButton As New Button
strID = m_node.Item("ID").InnerText
strName = m_node.Item("Name").InnerText
strPrice = m_node.Item("Price").InnerText
strOptions = m_node.Item("Options").InnerText
newButton.Name = "BTN_" & strID
newButton.Width = 150
newButton.Height = 150
newButton.BackgroundImageLayout = ImageLayout.Zoom
newButton.TextImageRelation = TextImageRelation.TextAboveImage
newButton.ForeColor = Color.White
newButton.Text = strName
AddHandler newButton.Click,Sub()
DGV_Receipt.Rows.Add(strName,strOptions,strPrice)
End Sub
newButton.BackgroundImage = Image.FromFile(".\Resources\Icons\" & strName & ".png")
FLP_Icons.Controls.Add(newButton)
Next
End Function 'end the function definition.
正在加载的函数:
Private Sub FORM_Main_Load(sender As Object,e As EventArgs) Handles MyBase.Load
loadMenuItems()
End Sub
我是VB的初学者,因此,如果我缺少明显的内容,请告诉我!
解决方法
如评论中所建议,问题是您的事件处理程序。 Lambda表达式的工作方式有些细微差别,而您对此一直感到厌恶。
一种选择是将正确的数据存储在每个Tag
的{{1}}属性(它是通用数据字段)中,例如
Button
,然后从事件处理程序中的newButton.Tag = {strName,strOptions,strPrice}
获取数据:
Button
或者,定义您自己的继承AddHandler newButton.Click,Sub(sender,e)
Dim btn = DirectCast(sender,Button)
Dim data = DirectCast(btn.Tag,String())
DGV_Receipt.Rows.Add(data(0),data(1),data(2))
End Sub
的自定义类,为这些值添加专用属性,然后在代码中使用它们。该自定义类将像常规的Button
一样工作,但是您可以在创建它时设置这些属性,然后在事件处理程序中从中获取数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。