gpt4 book ai didi

c# - 如何在 Asp.Net 中获取 Visible 属性的 set/real 值

转载 作者:行者123 更新时间:2023-11-30 12:18:33 28 4
gpt4 key购买 nike

控件的 Visible 属性的 Get 递归地查找树以指示控件是否将被呈现。

我需要一种方法来查看控件的“本地”可见值,而不管其父控件设置为什么。即它本身是否设置为 true 或 false。

我看到这个问题了,How to get the “real” value of the Visible property?它使用反射来获取本地状态,但是,我无法让它在 WebControls 中工作。这也是一种相当肮脏的获取值(value)的方法。

我想出了以下扩展方法。它的工作原理是从其父控件中移除控件,检查属性,然后将控件放回找到它的位置。

    public static bool LocalVisible(this Control control)
{
//Get a reference to the parent
Control parent = control.Parent;
//Find where in the parent the control is.
int index = parent.Controls.IndexOf(control);
//Remove the control from the parent.
parent.Controls.Remove(control);
//Store the visible state of the control now it has no parent.
bool visible = control.Visible;
//Add the control back where it was in the parent.
parent.Controls.AddAt(index, control);
//Return the stored visible value.
return visible;
}

这是一种可以接受的方式吗?它工作正常,我没有遇到任何性能问题。它看起来非常肮脏,我毫不怀疑它可能会在某些情况下失败(例如,在实际渲染时)。

如果有人对此解决方案有任何想法,或者更好的是找到值(value)的更好方法,那就太好了。

最佳答案

经过深入研究,我生成了以下扩展方法,该方法使用反射来检索 Visible 的值从 System.Web.UI.Control 继承的类的标志:

public static bool LocalVisible(this Control control)
{
var flags = typeof (Control)
.GetField("flags", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(control);

return ! (bool) flags.GetType()
.GetProperty("Item", BindingFlags.Instance | BindingFlags.NonPublic)
.GetValue(flags, new object[] {0x10});
}

它使用反射来查找私有(private)字段 flagsControl 内目的。该字段声明为内部类型,因此需要更多的反射来调用其索引器属性的 getter。

扩展方法已经在以下标记上进行了测试:

<asp:Panel Visible="false" runat="server">
<asp:Literal ID="litA" runat="server" />
<asp:Literal ID="litB" Visible="true" runat="server" />
<asp:Literal ID="litC" Visible="false" runat="server" />
</asp:Panel>

<asp:Literal ID="litD" runat="server" />
<asp:Literal ID="litE" Visible="true" runat="server" />
<asp:Literal ID="litF" Visible="false" runat="server" />

测试结果:

litA.LocalVisible() == true
litB.LocalVisible() == true
litC.LocalVisible() == false
litD.LocalVisible() == true
litE.LocalVisible() == true
litF.LocalVisible() == false

关于c# - 如何在 Asp.Net 中获取 Visible 属性的 set/real 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005322/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com