2011-11-02 52 views
4

这里是我在做什么禁用回发按钮ASP.NET C#

为例
Page Load 
{ 
    //Adds items to a panel (not an updatepanel just a normal panel control) 
} 

protected void btnNexMod_Click(object sender, EventArgs e) 
{ 

    // Calls DoWork() and Appends more items to the same panel 
} 

我的问题是,ASP:按钮是做回传以及调用DoWork()

因此,再打电话给我的页面加载,重新初始化我的面板:(

我想我的项目,我添加到面板呆在那里!

所有帮助表示赞赏,不寻找你的答案类型的交易。任何步骤表示赞赏谢谢!

下面是我的问题的确切例子。

protected void Page_Load(object sender, EventArgs e) 
{ 

    CheckBox chkbox = new CheckBox(); 
    chkbox.Text = "hey"; 
    chkbox.ID = "chk" + "hey"; 

    // Add our checkbox to the panel 
    Panel1.Controls.Add(chkbox); 
} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    CheckBox chkbox = new CheckBox(); 
    chkbox.Text = "hey"; 
    chkbox.ID = "chk" + "hey"; 

    // Add our checkbox to the panel 
    Panel1.Controls.Add(chkbox); 
} 

只有页面上的东西是一个空面板和一个按钮,这个点击偶处理程序。

我也试过这个,它仍然不起作用。现在它清除附加到面板上的初始项目。

if (!Page.IsPostBack) // to avoid reloading your control on postback 
{ 

    CheckBox chkbox = new CheckBox(); 
    chkbox.Text = "Initial"; 
    chkbox.ID = "chk" + "Initial"; 

    // Add our checkbox to the panel 
    Panel1.Controls.Add(chkbox); 
} 
+0

Page.IsPBackBack是你的朋友。 – jrummell

+0

什么我可以在这里与面板上的视图状态? – clamchoda

回答

8

如果你动态地将控件添加到面板,那么你就必须在每一个回传重新创建控件,并确保同样的分配ID控件使ViewState可以填充这些值。在OnInit期间通常最好重新创建动态内容,但在某些情况下这可能很困难。

我最喜欢的工具之一是DynamicControlsPlaceHolder,因为您可以为其添加动态控件,并且它会自动保留它们,而无需在页面上进行任何其他编码。只需添加控件,剩下的就可以完成。

这里的链接:
http://www.denisbauer.com/Home/DynamicControlsPlaceholder

至于防止执行回发的按钮,使用OnClientClick并返回false。

OnClientClick="return false;" 
+0

嘿詹姆斯!非常感谢,我得到了这个工作,你救了我一个头痛的声音!只是好奇,你有没有测试过这件事可以让我们每天说500个职位?我想知道这是否滥用视图状态,从而导致大量过载。再次感谢m8! – clamchoda

+0

嗨@James - 2014年DynamicControlsPlaceholder工具仍然相关/必要吗?只是好奇,因为我正在与动态控制摔跤,并会喜欢任何帮助,如果它仍然可用。 –

+0

@ChrisEmerson:这真的取决于你在建什么。如果您正在进行Web窗体开发,那么肯定还有一些应用程序,像这样的控件非常有用。如果可以的话,我会建议使用JavaScript,但对于那些不适合使用JavaScript的领域,此控件可以成为救生员。 –

0

您是对的,您将不得不在回传后将新项目添加到面板。这是.NET管道的本质。

如果您使用数据绑定控件(如Repeater)来显示面板内容,那么按钮点击处理程序只需重新绑定控件即可正常工作。

+0

感谢您的回复。是否有c#命令,我可以调用您需要将Repeater控件放置在Panel中的 – clamchoda

+0

,并通过设置DataSource并在中继器上调用.DataBind()将其绑定到数据。 4GuysFromRolla有几篇关于使用Repeater控件的优秀文章。 – drdwilcox

+0

不使用中继控制。我从数据库VIA sql获取两个变量。名称和ID。我想附加复选框使用这些名称和ID的面板 – clamchoda

3

你可以使用

<asp:LinkButton OnClientClick="javascript:addItemsToPanel();return false;" 

从而使用JavaScript函数来添加。这就是我解决这个问题的方法。

+0

使用哪个抱歉。所有出现在您的文章中的是“您可以使用” – clamchoda

+0

仍然是客户端?我需要的功能是severside – clamchoda

+0

是的,客户端。 – poldoj

3

你也可以试试这个:

Page Load 
{ 
    if (!this.IsPostBack) // to avoid reloading your control on postback 
    { 
     //Adds items to a panel (not an updatepanel just a normal panel control) 
    } 
} 
+0

我在页面加载时尝试了这个,但它仍然没有给我想要的结果。看我的编辑请 – clamchoda

+0

美丽!谢谢! – BossWalrus

2

你可以这样做...

ASPX code: 

<asp:LinkButton ID="someID" runat="server" Text="clicky"></asp:LinkButton> 

后面的代码:

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     someID.Attributes.Add("onClick", "return false;"); 
    } 
} 

什么呈现为HTML是:

<a onclick="return false;" id="someID" href="javascript:__doPostBack('someID','')">clicky</a> 
+0

谢谢今晚晚些时候我也会给你一个旋转。目前我正在使用接受的答案,但它看起来像DynamicPlaceHolder保存与视图状态... – clamchoda

+0

感谢您的答复。虽然,我不认为这可以编辑火灾的C#服务器端功能,以及做一些像“返回false”......可以吗? – clamchoda

0

更改ASP:按钮的ASP:LinkBut​​ton的解决我的问题。

+0

已答复此答案。 – Gatogordo