当前位置:编程学习 > C#/ASP.NET >>

求解怎么在 static 类中获取到当前页面的控件

比如我前台页面上有一个控件
<asp:Panel ID="Panel1" runat="server">
</asp:Panel>

而我后台 类中某个 静态类中要获取到这个控件 然后操作他。
求解 怎么获取前台的Panel --------------------编程问答-------------------- 说错了 是静态方法中获取控件、 --------------------编程问答-------------------- NEW 一个线程 
在他的委托方法中:
if(控件ID.invokerequired)
  控件ID.Invoke( 调用控件更改其属性的匿名函数代理)
else
  直接写调用控件更改其属性 --------------------编程问答-------------------- 应该是像方法中传递参数做逻辑处理后返回给页面,在表示层(页面)实现对控件的具体控制,而不是在类的方法中去操作某个控件

也许该了解下三层架构的模式

--------------------编程问答-------------------- var pnl = (Panel)(HttpContext.Current.Handler as Page).FindControl("Panel1");
你可以写扩展方法,扩展至Page类或者Control类或者接口 --------------------编程问答--------------------
引用 2 楼 johneyson 的回复:
NEW 一个线程 
在他的委托方法中:
if(控件ID.invokerequired)
  控件ID.Invoke( 调用控件更改其属性的匿名函数代理)
else
  直接写调用控件更改其属性


不懂哦 能详细点吗? --------------------编程问答--------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/// <summary>
///test 的摘要说明
/// </summary>
public class testClass
{
    public testClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
    public static void changeAttr() {
        var pnl = (Panel)(HttpContext.Current.Handler as Page).FindControl("Panel1");
        pnl.Visible = false;
    }
}
--------------------编程问答--------------------
引用 4 楼 dongxinxi 的回复:
var pnl = (Panel)(HttpContext.Current.Handler as Page).FindControl("Panel1");
你可以写扩展方法,扩展至Page类或者Control类或者接口


求详细信息 --------------------编程问答--------------------
引用 6 楼 u011096386 的回复:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/// <summary>
///test 的摘要说明
/// </summary>
public class testClass
{
    public testClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
    public static void changeAttr() {
        var pnl = (Panel)(HttpContext.Current.Handler as Page).FindControl("Panel1");
        pnl.Visible = false;
    }
}



取出来的pnl =null


我这个静态方法是[WebMethod] 我要在前台用JS来调用这个方法 然后创建一些控件放在页面上的Panel1 里面的 --------------------编程问答--------------------
引用 8 楼 ZhuMingTianCai 的回复:
Quote: 引用 6 楼 u011096386 的回复:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/// <summary>
///test 的摘要说明
/// </summary>
public class testClass
{
    public testClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
    public static void changeAttr() {
        var pnl = (Panel)(HttpContext.Current.Handler as Page).FindControl("Panel1");
        pnl.Visible = false;
    }
}



取出来的pnl =null


我这个静态方法是[WebMethod] 我要在前台用JS来调用这个方法 然后创建一些控件放在页面上的Panel1 里面的


js创建服务器控件?
这个不能够啊
你可以取出数据,然后用js 创建dom --------------------编程问答--------------------
引用 9 楼 u011096386 的回复:
Quote: 引用 8 楼 ZhuMingTianCai 的回复:

Quote: 引用 6 楼 u011096386 的回复:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/// <summary>
///test 的摘要说明
/// </summary>
public class testClass
{
    public testClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
    public static void changeAttr() {
        var pnl = (Panel)(HttpContext.Current.Handler as Page).FindControl("Panel1");
        pnl.Visible = false;
    }
}



取出来的pnl =null


我这个静态方法是[WebMethod] 我要在前台用JS来调用这个方法 然后创建一些控件放在页面上的Panel1 里面的


js创建服务器控件?
这个不能够啊
你可以取出数据,然后用js 创建dom


我代码是这样的

   /// <summary>
    /// 绑定选项值
    /// </summary>
    /// <param name="txtname"></param>
    /// <returns></returns>
    [WebMethod]
    public static void getValue(string txtname)
    {
        SoOptionsValueSystem system = new SoOptionsValueSystem();

        List<SoOptionsValue> list = system.Get_Info(txtname);
        CheckBoxList cblist = new CheckBoxList();

        cblist.RepeatColumns = 3;
        cblist.CellSpacing = 10;

        cblist.RepeatDirection = System.Web.UI.WebControls.RepeatDirection.Vertical;
        foreach (SoOptionsValue item in list)
        {


            cblist.ID = "CheckBoxList1";
            ListItem lt = new ListItem(item.txtValue, item.txtValue);
            lt.Attributes["text"] = item.txtValue;
            lt.Attributes["value1"] = item.txtValue;
            cblist.Items.Add(lt);
            
            Panel1.Controls.Add(cblist);


        }
        
    }


 Panel1.Controls.Add(cblist);
我现在就是获取不到 --------------------编程问答-------------------- 前台的异步处理操作后台的静态方法时,静态方法里是不能调用前台的服务器控件的。
这个苦逼的错误前几天搞的我恶心。建议lz还是根据9L的意见创建dom吧。 --------------------编程问答--------------------
引用 10 楼 ZhuMingTianCai 的回复:
Quote: 引用 9 楼 u011096386 的回复:

Quote: 引用 8 楼 ZhuMingTianCai 的回复:

Quote: 引用 6 楼 u011096386 的回复:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
/// <summary>
///test 的摘要说明
/// </summary>
public class testClass
{
    public testClass()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
    public static void changeAttr() {
        var pnl = (Panel)(HttpContext.Current.Handler as Page).FindControl("Panel1");
        pnl.Visible = false;
    }
}



取出来的pnl =null


我这个静态方法是[WebMethod] 我要在前台用JS来调用这个方法 然后创建一些控件放在页面上的Panel1 里面的


js创建服务器控件?
这个不能够啊
你可以取出数据,然后用js 创建dom


我代码是这样的

   /// <summary>
    /// 绑定选项值
    /// </summary>
    /// <param name="txtname"></param>
    /// <returns></returns>
    [WebMethod]
    public static void getValue(string txtname)
    {
        SoOptionsValueSystem system = new SoOptionsValueSystem();

        List<SoOptionsValue> list = system.Get_Info(txtname);
        CheckBoxList cblist = new CheckBoxList();

        cblist.RepeatColumns = 3;
        cblist.CellSpacing = 10;

        cblist.RepeatDirection = System.Web.UI.WebControls.RepeatDirection.Vertical;
        foreach (SoOptionsValue item in list)
        {


            cblist.ID = "CheckBoxList1";
            ListItem lt = new ListItem(item.txtValue, item.txtValue);
            lt.Attributes["text"] = item.txtValue;
            lt.Attributes["value1"] = item.txtValue;
            cblist.Items.Add(lt);
            
            Panel1.Controls.Add(cblist);


        }
        
    }


 Panel1.Controls.Add(cblist);
我现在就是获取不到


为什么要加上[WebMethod]
它是用不了服务器控件的
只能返回数据,操作不了你当前Page中的control --------------------编程问答-------------------- 12楼 我前台的JS 要调用到后台的 getValue方法、不会用别的所有只有用了[WebMethod] 加了个 static
--------------------编程问答-------------------- 楼主要做的是什么?
在Panel1加 CheckBoxList
可以将getValue只返回checkbox需要的数据,然后用js去在panel1 中创建checkbox

或不用js 创建 在服务器按钮的事件中调用 getValue

这个是需要回发,或者你在页面加载的时候调用 getValue才能有效的啊 --------------------编程问答-------------------- 我的需求是这样子的、
我页面加载的时候 要生成很多个 html 的img (只能是HTML的IMG)
然后我要给 img 添加一个onclick 来实现点击后创建 很多不同的控件放在panel1 
比如 我img1点击onclick 后要创建一些 checkbox
img2点击后要创建一些lable

我现在 创建控件什么的放在panel1 中都没问题。就差 js调用后台的getValue()方法 --------------------编程问答--------------------
引用 14 楼 u011096386 的回复:
楼主要做的是什么?
在Panel1加 CheckBoxList
可以将getValue只返回checkbox需要的数据,然后用js去在panel1 中创建checkbox

或不用js 创建 在服务器按钮的事件中调用 getValue

这个是需要回发,或者你在页面加载的时候调用 getValue才能有效的啊


大神 求解呀、 --------------------编程问答-------------------- asp.net造就了一大批不懂html,css,js和http协议的专业web开发人员
--------------------编程问答--------------------
引用 15 楼 ZhuMingTianCai 的回复:
我的需求是这样子的、
我页面加载的时候 要生成很多个 html 的img (只能是HTML的IMG)
然后我要给 img 添加一个onclick 来实现点击后创建 很多不同的控件放在panel1 
比如 我img1点击onclick 后要创建一些 checkbox
img2点击后要创建一些lable

我现在 创建控件什么的放在panel1 中都没问题。就差 js调用后台的getValue()方法


getValue()方法你只让他返回数据,将list 转换为json,然后前端用ajax调用getValue获取数据后解析json
脚本创建checkbox.
或者 直接在getValue()方法中直接利用list 拼成想要的html字符串,前端ajax调用后直接 innerHTML
panel 控件.net生成的html元素 是div 即<div id="Panel1"></div>

--------------------编程问答-------------------- HTTP基本就是Request和Response,而且是无状态的。
Request一个页面,服务器返回一些Html。
Request调用webmethod,返回一个字符串结果。
这两个Request直接互相是不知道的,因此做到你要的结果。

如果你问为什么页面上点击按钮,可以在处理函数中取得值.这是因为ViewState的存在,asp.net使用ViewState在两个request间传递空间中的值。Request一个页面和Request一个web servcie却没有ViewState存在。 --------------------编程问答-------------------- 这个静态方法,不可以只面对Panel这控件,而是考虑各种控件。建议使用接口。比如ATM柜员机,不只是针对本银行一某一种储蓄卡,而是面对各种银行卡。
--------------------编程问答-------------------- 对于你的问题:
引用
我的需求是这样子的、
我页面加载的时候 要生成很多个 html 的img (只能是HTML的IMG)
然后我要给 img 添加一个onclick 来实现点击后创建 很多不同的控件放在panel1 
比如 我img1点击onclick 后要创建一些 checkbox
img2点击后要创建一些lable

我现在 创建控件什么的放在panel1 中都没问题。就差 js调用后台的getValue()方法

既然在panel1中创建控件什么的都没有问题,就是说空间render成html已经返回给browser了,应该直接用js从控件中取得值就可以了,你可以用Chrome的Developer tools看看。 --------------------编程问答-------------------- 有关动态创建控件,并获取其值:
http://www.cnblogs.com/insus/archive/2012/10/09/2717420.html
http://www.cnblogs.com/insus/archive/2012/09/24/2700658.html --------------------编程问答-------------------- 直接传txt ddl作为参数
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,