【问题标题】:VB.Net How to check if a value has been set for a propertyVB.Net如何检查是否为属性设置了值
【发布时间】:2015-10-27 07:00:11
【问题描述】:

我花了几个小时试图弄清楚这一点,但结果却一无所获。我有一个 .ascx 用户控件,我传递了一些值,因此它将填充一些下拉列表。如果下拉列表没有“设置”值,我想隐藏下拉列表。这就是我在代码隐藏中的内容(我删除了不相关的部分)databaselinks.ascx.vb:

Public Class databaselinks
Inherits System.Web.UI.UserControl

Public Property Drawing As String
    Get
        '
    End Get
    Set(ByVal value As String)
        If Not (value Is Nothing) Then
            ' Create a new ListItemCollection
            Dim liDrawingLink As New ListItemCollection()

            ' Add items to the collection
            liDrawingLink.Add(New ListItem("For this drawing...", ""))
            liDrawingLink.Add(New ListItem("...view drawing details", "engdrawingdetail.aspx?dwg=" & value))
            liDrawingLink.Add(New ListItem("...view Bill of Materials", "engdrawingbom.aspx?dwg=" & value))
            liDrawingLink.Add(New ListItem("...list Work Orders", "wolist.aspx?dwg=" & value))
            liDrawingLink.Add(New ListItem("...list transmittals", "engtransmittaldrawing.aspx?dwg=" & value))

            ' Databind our DDL to the ListItemCollection we just filled
            ddDrawingLink.DataSource = liDrawingLink
            ddDrawingLink.DataTextField = "Text"
            ddDrawingLink.DataValueField = "Value"
            ddDrawingLink.DataBind()
            ddDrawingLink.Visible = True
        Else
            ddDrawingLink.Visible = False
        End If

    End Set
End Property

Sub btnGo3_Click(ByVal sender As Object, ByVal e As EventArgs)
    Response.Redirect(ddDrawingLink.SelectedItem.Value)
End Sub
End Class

还有我的用户控件数据库links.ascx:

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="databaselinks.ascx.vb" Inherits="Rubb_Intranet_Databases.databaselinks" %>

<asp:Table Id="tblA" RunAt="server" CssClass="printhide">
    <asp:TableRow Id="trA1" RunAt="server" >
        <asp:TableCell Id="tdA1" RunAt="server">
            <asp:Table Id="tblB" RunAt="server">
                <asp:TableRow Id="trB1" RunAt="server" >
                    <asp:TableCell Id="tdB1" RunAt="server" BackColor="#FFFF99" Style="font-size: 9px; border: 1px solid Black; padding: 2px;">
                        Choose a page to visit from the dropdown
                    </asp:TableCell>
                </asp:TableRow>
            </asp:Table>
        </asp:TableCell>
    </asp:TableRow>
    <asp:TableRow Id="TableRow1" RunAt="server" >
        <asp:TableCell Id="TableCell1" RunAt="server">
            <asp:DropDownList Id="ddDrawingLink" RunAt="server" Width="190" OnSelectedIndexChanged="btnGo3_Click" AutoPostBack="True" Visible="False" />
        </asp:TableCell>
    </asp:TableRow>
</asp:Table>

在我的主页中,我设置了用户控件的值:

dblinks.Drawing = "12345"

效果很好,但是在我没有设置绘图属性的页面上,我仍然得到一个空白下拉列表。我正在检查值是否为 Nothing,但这并没有,我也尝试检查它是否为 NullOrEmpty、IsEmpty,但无济于事。我也尝试过将默认值设置为 Nothing,但也没有用。我错过了什么?我知道我可以通过在我的页面上设置该值来强制它为 Nothing,但与其通过几十页将值设置为 Nothing,让控件确定该值是否已设置似乎更简单。

感谢您的意见,我从 StackOverflow 学到了很多东西,但这是我第一次不得不寻求帮助。

-=格伦

【问题讨论】:

  • 看起来你的下拉列表总是被渲染并且将它设置为 visible = false 不会隐藏它?当您点击 else 时,也许您可​​以改为将 display = none; 的 css 样式应用于您的控件。

标签: asp.net vb.net user-controls


【解决方案1】:

这个逻辑:

If Not (value Is Nothing) Then

在属性设置器中。因此,如果没有设置属性的值,则永远不会调用该逻辑。也许你想把它放在Page_Load 中? (或者,如果有用户控件的等价物,谢天谢地,我不得不使用 Web 表单已经有一段时间了。)像这样的东西:

Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs)
    If Drawing Is Nothing Then
        ddDrawingLink.Visible = False
    End If
End Sub

当用户控件在页面上下文中加载时,而不是在设置属性值时,这将有条件地隐藏该控件。 (因为从逻辑上讲,您希望在不设置属性值时发生这种情况。)

【讨论】:

  • 谢谢,这很有意义。出于某种原因,我的原始代码现在似乎可以正常工作了,可能是在添加了一个空的Page_PreInit 之后,但你的建议更好,因为它不会留下任何机会。
猜你喜欢
  • 2011-11-03
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多