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