UserControl中的Page_Load事件未触发

5
我在一个类库中创建了一个c#类,并将其添加到default.aspx中,但是我的代码没有触发page_load事件。以下是代码:
“我做错了什么?”
页面已经加载,但是没有显示标签。我已经正确地将控件添加到页面中,没有任何错误。我还添加了注册标记。
html标签:<RandoIntegerControls:RandomIntegerControl ID="RandomIntegerControl1" runat="server"></RandoIntegerControls:RandomIntegerControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.WebControls;

namespace CSIMedia.WebControls
{

  public class RandomIntegerControl : PlaceHolder
  {

    private Label _Label;


    public RandomIntegerControl()
    {

    }

    private void Page_Load(Object sender, EventArgs e)
    {

        this._Label = new Label();
        this.Controls.Add(this._Label);
        this._Label.Text = "Enter random values:";

    }

  }
}

Default.aspx页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register TagPrefix="RandoIntegerControls" Assembly="CSIMedia.WebControls" Namespace="CSIMedia.WebControls"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <RandoIntegerControls:RandomIntegerControl ID="RandomIntegerControl1" runat="server"></RandoIntegerControls:RandomIntegerControl>
    </div>
    </form>
</body>
</html>

你是否在使用它的aspx文件中包含了自定义控件的.ascx文件? - skaz
我已经删除了它。我没有创建任何ascx文件。我将此类作为class.cs文件创建,并将此控件类添加到页面中。但是我已经重新添加了default.aspx页面,但仍然无法解决问题。 - redoc01
你能展示一下你在页面中添加控件的代码吗? - skaz
我复制并粘贴了代码,但它不允许我添加HTML,或者我可以通过某种方式实现这一点,只是添加了一些HTML,我不知道为什么? - redoc01
尝试使用代码示例图标 { } 来添加代码。 - skaz
3个回答

9

试试这个:

public RandomIntegerControl()
{
    this.Load += Page_Load;
}

在页面(和用户控件)中,Page_Load方法通常会自动附加,这要归功于以下属性:<%@ Page ... AutoEventWireup="true" ... %>。如果您没有aspx / ascx文件,它不会自动发生,但您仍然可以使用上述代码手动连接它。

当我将这段代码转换为VB.Net时,一切都运行正常。我是一个VB.Net开发人员,但在我申请的一个测试项目中被要求使用C#,有什么快速解决方法,以便我能够快速完成测试? - redoc01
抱歉,我不确定我理解你的问题。我写的代码是C#,你是在问VB版本吗? - Xavier Poinas

2

你正在继承自PlaceHolder,它是一个Web控件,不会处理Page_Load事件。只有用户控件(.ascx)才能隐式处理该事件。

从你发布的代码来看,最好使用用户控件,或者如果需要在多个项目中重复使用,则可以从头开始创建Web控件。


@clint,这不是我已经做过的吗?我是从头开始创建了一个WebControl。你是说我需要继承自Web Control才能触发Page_Load事件吗? - redoc01
不,要从头开始创建Web控件,您需要继承Web Control本身并覆盖相关方法以创建控件。从PlaceHolder继承意味着功能已经发生。 - Clint
你被要求做什么具体的事情? - Clint
@Clint 简单地创建一个应用程序,允许用户输入随机数字并按升序或降序显示它们,他们已经提供了 CSS 和 HTML,我只需要让功能正常工作即可。 - redoc01
@Clint 谢谢,还有谢谢大家。我正在重写这些方法并且现在它们都很好用,基本上我使用了"protected override void OnInit(EventArgs e)"来触发事件。这样可以吗 @Clint? - redoc01
是的,您可以重写该方法以执行上面代码中指定的操作,只需确保在执行任何其他操作之前调用base.OnInit(e),以便调用基类方法。 - Clint

0
原来你可以在 aspx 标记文件中重写 Page_Load 方法。该文件继承自基础文件。
<%@ Control Language="C#" AutoEventWireup="true" 
    CodeBehind="TestUserControl.ascx.cs" Inherits="TestUserControl" %>

覆盖示例:

<script language="C#" runat="server">
    public void Page_Load(object sender, EventArgs e)
    {
        ...
    }
</script>

此函数覆盖了代码后台版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接