VB.NET中如何将Windows窗体数据传递至用户控件?
解决Windows窗体向用户控件UC_REQUEST传递数据的问题
看起来你现在的代码核心问题是:你新建了UC_REQUEST的实例nform,但这个实例没有被添加到窗体的控件集合里,所以你往它的ListView2里加的内容根本看不到。我给你分两种常见场景来讲解正确的实现方式:
场景1:用户控件已经在窗体上(设计时拖拽添加)
如果你已经在窗体设计界面把UC_REQUEST拖进去了(比如给它命名为ucRequest1),那直接操作这个已存在的实例就行,不用新建:
' 直接用窗体上已有的UC_REQUEST实例ucRequest1 Dim lv As ListViewItem = ucRequest1.ListView2.Items.Add(cbBranch.Text) lv.SubItems.Add(lbParticular.Text) lv.SubItems.Add(lbID.Text) lv.SubItems.Add(txtAmount.Text) lv.SubItems.Add(txtRemarks.Text) lv.SubItems.Add(txtCredit.Text)
这样添加的内容就会显示在窗体上的用户控件里了。
场景2:需要动态创建用户控件
如果你是要在运行时动态生成UC_REQUEST,那必须把新建的实例添加到窗体的某个容器(比如Panel、GroupBox)或者直接添加到窗体的控件集合中,否则它只是内存里的对象,不会显示:
' 新建用户控件实例 Dim nform = New UC_REQUEST ' 设置控件的布局(比如填充整个Panel1) nform.Dock = DockStyle.Fill ' 把控件添加到窗体的容器里(这里用Panel1举例) Me.Panel1.Controls.Add(nform) ' 现在再添加ListView项 Dim lv As ListViewItem = nform.ListView2.Items.Add(cbBranch.Text) lv.SubItems.Add(lbParticular.Text) lv.SubItems.Add(lbID.Text) lv.SubItems.Add(txtAmount.Text) lv.SubItems.Add(txtRemarks.Text) lv.SubItems.Add(txtCredit.Text)
更规范的封装写法(推荐)
为了降低窗体和用户控件的耦合,最好在UC_REQUEST内部封装一个添加数据的方法,而不是让窗体直接操作控件的ListView。
在UC_REQUEST的代码里添加这个方法:
Public Sub AddRequestItem(branch As String, particular As String, id As String, amount As String, remarks As String, credit As String) Dim lv As ListViewItem = Me.ListView2.Items.Add(branch) lv.SubItems.Add(particular) lv.SubItems.Add(id) lv.SubItems.Add(amount) lv.SubItems.Add(remarks) lv.SubItems.Add(credit) End Sub
然后在窗体里直接调用这个方法就行:
- 场景1(已有实例):
ucRequest1.AddRequestItem(cbBranch.Text, lbParticular.Text, lbID.Text, txtAmount.Text, txtRemarks.Text, txtCredit.Text)
- 场景2(动态创建):
Dim nform = New UC_REQUEST nform.Dock = DockStyle.Fill Me.Panel1.Controls.Add(nform) nform.AddRequestItem(cbBranch.Text, lbParticular.Text, lbID.Text, txtAmount.Text, txtRemarks.Text, txtCredit.Text)
这种写法的好处是,以后如果用户控件里的ListView结构变化,只需要修改控件内部的方法,不用改窗体的代码,更易维护。
内容的提问来源于stack exchange,提问作者DIANA ROSE ARNAIZ
相关产品推荐
相关产品推荐

