在asp.net中创建一个带按钮的类作为成员

时间:2011-09-06 15:52:47

标签: c# asp.net webforms

我继承了一个asp.net网络应用程序,它将信息传递给gridview。每行上都有不同的按钮和链接,并根据收到的信息启用/禁用它们。每行都有一个很长的逻辑链来设置按钮,这使得它很难阅读。有没有办法设置一类按钮,使这更容易阅读?

2 个答案:

答案 0 :(得分:1)

不确定“按钮类”的含义,但您可以创建自定义服务器控件作为按钮控件的包装,并提供一些额外的属性或方法来简化GridView逻辑。

这是我们构建的RadioButton包装器的一个快速而又脏的示例,它扩展了标准单选按钮的属性,以便它可以保存额外的信息。您可以尝试为GridView按钮执行类似的操作:

[DefaultProperty("Text")]
[ToolboxData("<{0}:RadioButton runat=server></{0}:RadioButton>")]
public class RadioButton : System.Web.UI.WebControls.RadioButton
{
    [Bindable(true)]
    [DefaultValue("")]
    [Localizable(true)]
    public string Value
    {
        get
        {
            string RadioValue = (string)ViewState["Value"];
            return (RadioValue == null) ? String.Empty : RadioValue;
        }

        set
        {
            ViewState["Value"] = value;
        }
    }

    protected override void RenderContents(HtmlTextWriter output)
    {
        output.Write(Text);
    }
}

答案 1 :(得分:1)

您可以快速完成的一件事是将DataSource转换为报表类。然后,您可以将启用/禁用的逻辑移动到该类(即每个按钮的单个属性),并更新网格以简单地检查每个链接/按钮的相应属性。

这至少会将逻辑从aspx文件移到某个可以更容易维护/阅读的地方。

例如:

grid.DataSource = MyReportClass.GetReport();

其中

public MyReportClass
{

    public string Name { get; set; }
    public string EnableLink1 { get { //logic here } }
    public string EnableButton3 { get { ///logic here } }

    public static List<MyReportClass> GetReport()
    { 
        // get the data
    }
}

然后aspx变为

<gridview id="grid" runat="server" ... >
   ...
   <asp:templatefield headertext="Link1" ><itemtemplate>
     <asp:linkbutton id="l1" runat="server" ...
       visible='<%# !(bool)DataBinder.Eval(Container.DataItem, "EnableLink1") %>'                          
      />
    </itemTemplate></asp:templatefield>
    ...
</gridview>