【问题标题】:Render User Control Conditionally有条件地渲染用户控件
【发布时间】:2011-05-05 06:53:42
【问题描述】:

我有一个简单的用户控件来将数据插入数据库。我为用户控件创建了一个名为 isInModifyMode 的公共属性。如果在父表单控件的单击事件上单击编辑按钮,则将用户控件页面加载上的属性设置为 true,然后在父页面的页面加载事件上检查属性 IsinModifymode并在修改模式下渲染控件,并在文本框和数据库中的所有其他控件中填充值(即我将按钮的文本属性更改为更新而不是保存)

但代码不起作用。 如果有任何机构可以提供帮助,请提前致谢。

【问题讨论】:

  • 能否提供一些sn-ps的代码。根据您的描述很难理解问题。你说,“......父窗体控件的点击事件......”我相信你的意思是父窗体上的按钮上的点击事件,但我不是 100% 确定。
  • 感谢 GunnerL3510 我对帖子进行了更改以使其更易于理解

标签: asp.net user-controls properties pageload


【解决方案1】:

目前还不太清楚您要做什么以及究竟什么不起作用。但我会尝试回答一些假设:

  • 您希望表单根据 isInModifyMode 仅基于简单的回发事件进行更改
  • “父表单控件的点击事件”是指触发回发的单个按钮
  • 您正在使用 C# 和代码隐藏

原理很简单,有很多方法可以做我认为你所要求的。一种方法是基本上将事件绑定到按钮以设置控件的 isInModifyMode 属性。在控件本身中,让属性的 setter 调用更新显示的方法。这在以下非常基本且不完美的示例中得到了说明:

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Src="WebUserControl.ascx" TagName="WebUserControl" TagPrefix="uc1" %>

<!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 runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <uc1:WebUserControl ID="WebUserControl1" runat="server" isInModifyMode="false" />
        <asp:Button ID="EditButton" runat="server" Text="Edit" />
    </form>
</body>
</html>

Default.aspx.cs

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    protected override void OnInit(EventArgs e)
    {
        // Assign the handler for the edit button click event
        EditButton.Click += new EventHandler(EditButton_Click);

        base.OnInit(e);
    }

    /// <summary>
    /// Edit button click handler
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void EditButton_Click(object sender, EventArgs e)
    {
        WebUserControl1.isInModifyMode = true;
    }
}

WebUserControl1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>

<asp:PlaceHolder ID="ReadOnlyModePlaceholder" runat="server">
    <p>Read Only Mode</p>
</asp:PlaceHolder>

<asp:PlaceHolder ID="EditModePlaceholder" runat="server" Visible="false">
    <p>Edit Mode</p>
</asp:PlaceHolder>

WebUserControl1.ascx.cs

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class WebUserControl : System.Web.UI.UserControl
{
    /// <summary>
    /// Changes the display mode by toggling the appropriate controls on or off
    /// based on the isInModifyMode property
    /// </summary>
    private void SetDisplayMode()
    {
        if (!this.isInModifyMode)
        {
            // Render as not modify
            ReadOnlyModePlaceholder.Visible = true;
            EditModePlaceholder.Visible = false;
        }
        else
        {
            // Render as modify
            ReadOnlyModePlaceholder.Visible = false;
            EditModePlaceholder.Visible = true;
        }
    }

    /// <summary>
    /// Determines whether or not the control should be displayed in edit mode or not.
    /// </summary>
    public bool isInModifyMode
    {
        get
        {
            if (ViewState["isInModifyMode"] != null)
                return (bool)ViewState["isInModifyMode"];
            else
                return false;
        }
        set
        {
            ViewState["isInModifyMode"] = value;
            // Since we're possibly changing modes, call
            // the SetDisplayMode() method to update the display
            SetDisplayMode();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Set the display mode on the initial load
        if (!IsPostBack)
            SetDisplayMode();
    }
}

【讨论】:

  • 感谢 Kiddailey,如果可行,我会尝试这个解决方案并让您知道
【解决方案2】:

查看ASP.Net page life cycle 和事件顺序。

页面加载和控件加载事件在 ButtonClick 之前触发。将渲染逻辑移至 PreRender 事件。

如果这没有帮助,请添加一些代码以更好地理解问题。

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 2014-11-26
    • 2012-11-20
    • 2018-09-13
    • 2019-02-18
    • 1970-01-01
    • 2019-03-24
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多