0

我不太确定如何解决这个问题,所以认为最好问一下,看看是否有人有任何可能有帮助的想法。

我有一个存储在 SQL Server 中的表,它使用此架构存储 Exchange 2010 邮箱服务器性能数据:

CREATE TABLE [dbo].[2010_Perfmon_MBX]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Server] [varchar](50) NULL,
    [ObjectName] [varchar](100) NULL,
    [CounterName] [varchar](100) NULL,
    [InstanceName] [varchar](100) NULL,
    [Value] [decimal](18, 3) NULL,
    [DateTime] [datetime] NULL
)

我还有一个用 C# 编写的 ASP.NET 网站。我想允许用户选择级联答案,最终将请求的数据返回到 GridView/Graph 中。

现在,我的主要挑战是如何确保在最终用户从所有列中选择值之前不返回数据。

我想这样上演:

要求用户提供服务器以从中提取数据

SELECT DISTINCT(Server)
FROM 2010_Perfmon_MBX

让我们假设他们选择了服务器MailboxServer.domain.com

SELECT DISTINCT(ObjectName)
FROM 2010_Perfmon_MBX
WHERE Server = 'MailboxServer.domain.com'

然后根据服务器向用户询问MailboxServer.domain.comObjectName。他们选择'msexchangeis mailbox'例如:

SELECT DISTINCT(CounterName)
FROM 2010_Perfmon_MBX
WHERE Server = 'MailboxServer.domain.com'
AND ObjectName = 'msexchangeis mailbox'

接下来要求用户输入CounterName. 他们选择'active rpc threads'

SELECT DISTINCT(InstanceName)
FROM 2010_Perfmon_MBX
WHERE Server = 'MailboxServer.domain.com'
AND ObjectName = 'msexchangeis mailbox'
AND CounterName = 'active rpc threads'

最后他们选择了InstanceName. 在这个例子'Database20'中。然后运行完整的查询,根据所做的选择拉回所有数据:

SELECT *
FROM 2010_Perfmon_MBX
WHERE Server = 'MailboxServer.domain.com'
AND ObjectName = 'msexchangeis mailbox'
AND CounterName = 'active rpc threads'
AND InstanceName = 'Database20'

什么是最优雅的方式来确保选择流程正常工作而不跳进和链接选择?

我需要确保选择是动态的,并且基于所选服务器的 SQL Server 表中的可用数据,因此只能选择有效数据。

谢谢阅读。

4

1 回答 1

1

相当广泛的问题,所以这里有一个广泛的答案。我将假设您的 Web 应用程序是 ASP.NET WebForms。

  1. 使用 DropDownList 控件进行用户选择,使用 RequiredFieldValidator 控件来确保用户从每个选项中做出有效选择。
  2. 将下拉列表与您的 SELECT DISTINCT 数据绑定
  3. 有一个提交按钮,在回发检查 Page.IsValid 时,如果为真,则获取数据并绑定 GridView。

更新

好的,我认为您是说可用的选择取决于前一个,从服务器开始。在这种情况下,一次呈现每个 DropDownList(使其可见),将它们的 autopostback 属性设置为 true。每次索引更改都会重新绑定所有后续依赖的 DropDownLists。您还可以使用验证器控件来确保用户在提交之前已在所有列表中做出选择:

aspx

<asp:DropDownList ID="ddlObjectName" runat="server" DataSourceId="dsObjectName" 
    OnDataBound="ddlObjectName_DataBound"></DropDownList>
<asp:RequiredFieldValidator ID="ddlObjectNameRequired" runat="server" 
        ControlToValidate="ddlObjectName" InitialValue="-1"
        ErrorMessage="Please select an Object Name.">
</asp:RequiredFieldValidator>

<asp:Button ID="Submit" runat="server" Text="Submit" OnClick="Submit_Click" />

aspx.cs

protected void ddlObjectName_DataBound(object sender, EventArgs e)
{
    ddlObjectName.Items.Insert(0, new ListItem("Please Select...", "-1"));
}

protected void Submit_Click(object sender, EventArgs e)
{
    if(Page.IsValid)
    {
        //Bind the data grid ...
    }
}
于 2012-09-30T16:54:20.067 回答