【问题标题】:Accessing Controls on ListView Edit Command访问 ListView 编辑命令上的控件
【发布时间】:2012-02-18 03:09:43
【问题描述】:

在我的 ListView 中,ItemTemplate 和 EditItemTemplate 分别看起来像这样。

-------->

当我点击“编辑”按钮,并切换到右侧的EditItemTemplate 视图时,我想预填充Textbox 并在DropDownList 中选择对应的option。我该怎么做?

在您说要使用以下内容之前,请注意我已经探索了我能想到的所有可能的变化。很抱歉这么苛刻,但如果你回答,请准备好引导我完成这个。 ^.^ 我已经被这个问题困扰了好几个月:(

Dim lv As ListView = DirectCast(sender, ListView) 'sender is the ListView on the ItemCommand event
Dim ddl As DropDownList = DirectCast(lv.Items(0).FindControl("NewProductName_ddl"), DropDownList)
Dim tb As TextBox = DirectCast(lv.Items(0).FindControl("NewProductName_tb"), TextBox)

更新 - RAWR!!

哦,我的天哪,这么近,但没有雪茄。当 ListView 中只有一个项目时,以下代码适用于预填充,但当存在多个项目时,它会抛出 NullReferenceException :(

'PROBLEM WAS HERE: Compare to the working code in my answer.
Protected Sub NewProduct_ItemDataBound(ByVal sender As ListView, ByVal e As ListViewItemEventArgs) Handles NewProduct.ItemDataBound
    If sender.EditIndex > -1 Then
        Dim ddl As DropDownList = DirectCast(e.Item.FindControl("NewProductName_ddl"), DropDownList)
        Dim tb As TextBox = DirectCast(e.Item.FindControl("NewProductName_cb"), TextBox)

        ddl.Items.FindByValue(sender.DataKeys(sender.EditIndex)("ID").ToString).Selected = True 'Prefills the DropDownList
        tb.Text = sender.DataKeys(sender.EditIndex)("Product").ToString 'Prefills the TextBox
    End If
End Sub

【问题讨论】:

  • 你看过这里stackoverflow.com/questions/825048/…。您尝试在哪个事件中访问控件?
  • @PaulMcCowat 是的,我现在正在更仔细地查看它,但我仍然无法连接这些点。如何“告诉” ItemDataBound DropDownList SelectedValue 应该来自 ItemCommand 事件?即我如何在事件之间传递该数据?还是我想错了?看看我有多迷茫? :'(
  • 看起来您正在寻找NewProductName_ddl,就好像它是一个实例一样。这可能会返回 DropDownLists 的集合。在没有完整的 html 和代码可用的情况下,很难帮助您编写代码。

标签: asp.net vb.net listview initialization findcontrol


【解决方案1】:

尤里卡!!

我高兴得超乎想象!!全部大写,也没有粗体来说明我现在有多开心 :)

首先我想给this question 提供道具,这让我指出了正确的方向。现在来看答案,这是我在上述链接中找到的最理想的答案:

ItemDataBound 事件是关键,但重要的是要注意,该事件将针对您的ListView 中存在的每个项目触发,因此,您必须小心处理方法。这里有两个对我同样有效的选项。

选项 1 - 最优雅;仅对有问题的项目而不是所有项目运行 FindControl。

Protected Sub NewProduct_ItemDataBound(ByVal sender As ListView, ByVal e As ListViewItemEventArgs) Handles NewProduct.ItemDataBound
    Dim i As Integer = sender.EditIndex
    If i = e.Item.DataItemIndex Then
        Dim ddl As DropDownList = DirectCast(e.Item.FindControl("NewProductName_ddl"), DropDownList)
        Dim tb As TextBox = DirectCast(e.Item.FindControl("NewProductName_cb"), TextBox)

        ddl.Items.FindByValue(sender.DataKeys(i)("ID").ToString).Selected = True 'Prefills the DropDownList
        tb.Text = sender.DataKeys(i)("Product").ToString 'Prefills the TextBox
    End If
End Sub

选项 2 - 基于引用的问题,但需要进行关键检查以确保非空对象。

Protected Sub NewProduct_ItemDataBound(ByVal sender As ListView, ByVal e As ListViewItemEventArgs) Handles NewProduct.ItemDataBound
    Dim i As Integer = sender.EditIndex
    If i > -1 Then
        Dim ddl As DropDownList = DirectCast(e.Item.FindControl("NewProductName_ddl"), DropDownList)
        Dim tb As TextBox = DirectCast(e.Item.FindControl("NewProductName_cb"), TextBox)

        If Not IsNothing(ddl) Then
            ddl.Items.FindByValue(sender.DataKeys(i)("ID").ToString).Selected = True 'Prefills the DropDownList
        End If
        If Not IsNothing(tb) Then
            tb.Text = sender.DataKeys(i)("Product").ToString 'Prefills the TextBox
        End If
    End If
End Sub

我稍后可能会对此答案进行改进,但这对我有用。 :)

【讨论】:

    【解决方案2】:

    很棒的帖子!我遇到了同样的问题,您为我节省了数小时的反复试验。只是想指出,在 .NET Framework 3.5 或更低版本中使用您的第一个选项时,DataItemIndex 不可用。要解决它,您可以替换

    If i = e.Item.DataItemIndex Then
    

    有

    If i = DirectCast(e.Item, IDataItemContainer).DataItemIndex Then
    

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      相关资源
      最近更新 更多