【问题标题】:Custom ListView to show EmptyDataTemplate and InsertItemTemplate at the same time自定义 ListView 同时显示 EmptyDataTemplate 和 InsertItemTemplate
【发布时间】:2011-04-19 13:32:25
【问题描述】:

众所周知,ListView 控件不能同时显示 EmptyDataTemplate 和 InsertItemTemplate。

对于我的设计风格,我需要能够同时展示两者。我希望能够显示不存在任何数据,同时显示一个表单来添加新数据。

我已经实现了各种解决方案,例如在我的 LayoutTemplate 中放置一个 PlaceHolder,然后在代码隐藏中手动显示或隐藏这个 PlaceHolder,具体取决于是否有数据。

但是,我想要一个具有此内置功能的控件,以使我的代码隐藏更轻松。

我相信只有两种方法可以实现我想要的:

  1. 第一种方式(首选)是自己编写自定义控件。我正在考虑从 ListView 派生并覆盖负责禁用 EmptyDataTemplate 的函数,但我没有自定义控件的经验。而且我什至不确定它最终会起作用。

  2. 第二种方法是使用在某处找到或购买的自定义控件。我一直找不到与 ListView 具有相同基本功能的控件。

有人知道如何解决#1 和#2 吗?

谢谢。

【问题讨论】:

    标签: asp.net data-binding listview controls custom-controls


    【解决方案1】:

    如果没有您实际尝试实现的屏幕截图,我不太了解您的要求。无论如何,您可以通过 ListView+FormView 或 ListView+用户控件的组合来实现此界面。如果您能提供更多信息,我可能会提供进一步的帮助。

    【讨论】:

      【解决方案2】:

      我会选择您的选项 1:创建自定义控件 因为你没有指定我在 VB.NET 中制作的编程语言:

      Public Class CustomListView
          Inherits ListView
          Public Sub CheckEmptyData() Handles Me.PreRender
              If Me.Items.Count = 0 Then
                  Dim label As New Label
                  label.Text = "No data found <br/>"
                  Me.Controls.AddAt(0, label)
              End If
          End Sub
      End Class
      

      刚刚测试过,效果很好,可以替换现有的ListView。

      如您所见,它会检查是否有任何数据,如果没有,它会插入一个带有“未找到数据”文本的标签。我还没有找到一种简单的方法来为此使用 EmptyDataTemplate,这将是一个更好的选择,但这可能已经适合你了。

      另一个选项是在没有数据的情况下隐藏 InsertItem (InsertItemPosition.None),并向 EmptyDataTemplate 添加一个“Insert”按钮以启用 InsertItemTemplate 并因此隐藏 EmptyDataTemplate。

      【讨论】:

      • 非常感谢,这帮助我解决了我的问题。我从你的建议开始,我努力达到了一个完美的解决方案。我会奖励你积分,因为你应得的,但我会添加我自己的解决方案。
      • 并不是说我在给出所有分数后期待答案,但是......这有一个问题。在 InsertItemTemplate 中,我在用于插入新项目的字段上有一个 RequiredFieldValidator,它不断被触发......
      • 您的意思是它一直被触发并且即使 TextBox(?) 有值也无法验证?或者当您尝试在页面上执行其他操作(其他按钮或其他内容)并且不尝试插入项目时是否会触发它?如果是第二种情况,请尝试将验证组添加到验证器、文本框和插入按钮。
      • 你的第一个猜测,它不断被触发,我在 TextBox 中有一个值。看起来像在 Controls 集合中添加一个项目会以某种方式破坏验证器的期望。
      • 似乎验证器不再针对正确的控件,但我不知道为什么......
      【解决方案3】:

      这是我最终做的:

      public class MyListView : ListView
      {
          protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)
          {
              int itemCount = base.CreateChildControls(dataSource, dataBinding);
      
              if (this.InsertItemPosition != InsertItemPosition.None && itemCount == 0)
              {
                  CreateEmptyDataItem();
              }
      
              return itemCount;
          }
      }
      

      效果很好!

      【讨论】:

      • 很好的解决方案,我在编写代码时一定忽略了 CreateEmptyDataItem 函数。感谢您的赏金!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多