【问题标题】:Disable postback for buttonfields/commandfield in gridview在gridview中禁用按钮字段/命令字段的回发
【发布时间】:2013-03-27 10:49:57
【问题描述】:

我有一个数据绑定到网格视图的对象列表。 gridview 有一个附加到行的删除按钮。

我需要通过点击保持对象列表(就像离线工作一样) 我不想使用会话、cookie 或视图状态

当前行为: 列表有 4 项 => 删除 1 项 => 列表有 3 项 => 删除 1 项(POSTBACK)列表重新生成 4 项然后删除 1。

class Emails
{
    public string Email { get; set; }
    public Emails(string _Address)
    {
        Email = _Address;
    }
}


        if (!IsPostBack)
        {
            ListOfEmails = new List<Emails>();
            ListOfEmails.Add(new Emails("1@a.com"));
            ListOfEmails.Add(new Emails("2@a.com"));
            ListOfEmails.Add(new Emails("3@a.com"));
            ListOfEmails.Add(new Emails("4@a.com"));

            GridView1.DataSource = ListOfEmails;
            GridView1.DataBind();
        }

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        string EmailToBeDeleted = GridView1.Rows[e.RowIndex].Cells[0].Text;
        ListOfEmails.Remove(ListOfEmails.Find(L => L.Email == EmailToBeDeleted));
        GridView1.DataSource = null;
        GridView1.DataSource = ListOfEmails;
        GridView1.DataBind();
    }

aspx:

        <asp:BoundField DataField="Email" HeaderText="Email Address" />
        <asp:ButtonField ButtonType="Button" CommandName="Delete" HeaderText="Action2" 
            ShowHeader="True" Text="Delete" />    
        <asp:CommandField ButtonType="Image" DeleteImageUrl="~/delete.gif" 
            ShowDeleteButton="True" />

“我现在有 2 个删除按钮”

【问题讨论】:

  • 将它们放在更新面板中?
  • 这只会抑制回发或使它们不可见我希望禁用它们,直到我明确命令回发。

标签: asp.net gridview


【解决方案1】:

网页是无状态的。如果重新加载页面,所有控件和数据都会重新创建。这就是我们使用 Viewstates 和 Session 变量等东西来跨 post/gets 持久化数据的原因。使用缓存和更新面板等其他技术只会隐藏您正在使用视图状态的事实。我能想到的唯一选择是读取/写入某些数据源(数据库或 XML 等平面文件),但这比使用视图状态或会话开销更大。也许如果您解释您想要避免这些选项的原因,我们可以想出一个解决方案?

【讨论】:

  • 我不想使用 Session/ViewState 因为我想用另一种方式来做。我希望像在桌面 .net 上那样做,即在列表中工作(在内存中),没有页面回发,并且只在需要时才做
  • 桌面应用程序和网络应用程序有着根本的不同。桌面应用程序允许 GUI 和服务器/应用程序代码之间的无缝通信。正如我上面提到的,HTTP 是无状态的。这意味着服务器代码和在用户 Web 浏览器上呈现的代码之间没有通信。这种通信是通过视图状态、会话等完成的。您可以使用这些对象使应用程序看起来像一个桌面应用程序,但实际上并不是一个。
  • 我明白这一点,我通过使用 Session 进行持久性解决了这个问题。我想要的行为是模仿桌面应用程序,但在完成之前不使用回发,例如保存按钮
  • 哦,我想我明白你在说什么了。因此,您希望能够在不进行回发的情况下从 gridview 中删除一行(即:通过 jQuery 的 javascript),然后在用户单击“提交”按钮时更新数据源?
  • 这确实是不可取的,因为 gridview 不打算以这种方式工作,并且可能会导致意想不到的问题。话虽如此,以下是我找到的一些文章:dotnetsavvyblog.blogspot.com/2007/11/…forums.asp.net/t/1299021.aspx
猜你喜欢
  • 1970-01-01
  • 2012-09-17
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2013-04-10
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多