1

我有一个带有两个下拉列表和一个gridview 的asp.net 网页。

这两个下拉列表基于对 SQL 数据库 (2008R2) 的查询。下拉列表填充得很好。

我需要做的是根据下拉菜单中的选择创建一个网格视图。

第一个下拉菜单允许用户选择工作名称 - 虽然这对用户有帮助,但我需要的是与该工作名称相关联的工作 #。第二个下拉菜单是一个非常直接的阶段(三个选择)。

现在我有基于 SQL 中主表的网格视图,但我只需要显示相关的结果。我可以根据过滤器执行此操作,但用户通常不知道作业编号。

这是gridview的数据源:

SELECT a.[Annotation Number], a.Page_ID, a.[Annotation By], a.[Annotation Type], 
a.[Business Unit], a.[Actual Agency Error], a.[Error Type], a.[Annotation Comments], 
a.[Team Comments], a.sgkComments 
FROM MasterAnnotation AS a 
INNER JOIN ActiveWorkPages AS b 
ON a.Page_ID = b.WorkPage INNER JOIN ActiveJob AS c ON c.Job = b.Job 
ORDER BY a. [Annotation Number]

我认为我可以做的是将两个变量添加到数据源中以通过 b.Job = @Job 和 Stage = @Stage 来限制它

我知道我需要自动回发才能更新 gridview。
我还需要根据客户输入使用某些列更新 gridview(项目的下一阶段)

提前感谢您的帮助。

4

2 回答 2

2

这里有几个细节可以让你朝着正确的方向前进。

填充作业下拉列表时,使用作业 ID 作为选项值。这将显示作业名称,但它将在后台保存作业 ID

以下是如何从代码中执行此操作,但如果您使用 SQLDataSource 或类似的东西,您也可以从设计器中执行此操作。

string sql = "select job_name, job_id from dbo.jobs";

using (SqlConnection conn = new SqlConnection("your conneciton string"))
{
     using (SqlCommand cmd = new SqlCommand(sql, conn))
     {
       SqlDataAdapter adapter = new SqlDataAdapter(cmd);
       DataSet data = new DataSet();
       adapter.Fill(data);

       ddlJobs.DataSource = data;
       ddlJobs.DataTextField = "job_name";
       ddlJobs.DataValueField = "job_id";
       ddlJobs.DataBind();
    }
}

一旦你有了这个,你可以将参数传递给用于填充gridview的查询,然后刷新。想法是在您的网格视图中使用 SelectedValue 属性。

string sql = "select * from table where job_id = @job_id";

using (SqlConnection conn = new SqlConnection("your conneciton string"))
{
      using (SqlCommand cmd = new SqlCommand(sql, conn))
     {
           cmd.Parameters.Add(new SqlParameter("@job_id", ddlJobs.SelectedValue));
           SqlDataAdapter adapter = new SqlDataAdapter(cmd);
           DataSet data = new DataSet();
           adapter.Fill(data);

           gridView.DataSource = data;
           gridView.DataBind();
     }
}

还要确保将下拉列表中的 AutoPostback 属性设置为 True 并在选定索引更改时设置事件处理程序

<asp:DropDownList ID="ddlJobs" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlJobs_OnSelectedIndexChanged">
        </asp:DropDownList>
于 2013-08-21T15:31:27.787 回答
1

您可以在下拉列表更改或单击按钮时调用类似的内容。(不知道你是如何配置的)

//import and add the System.Data.SqlClient Namespace
using System.Data.SqlClient;


 try //Try block for opening, querying and displaying pulled data
            {   
            sqlConn.Open();
            cmdstring = "Select col1, col2, col3 from tablename where field 1 = '" + ddllist1.selecteditem.value+ "' and field2 = '" + ddllist2.selecteditem.value + "'";
            sqlcmd01 = new SqlCommand(cmdstring, sqlConn);
            reader01 = sqlcmd01.ExecuteReader();
            //set the datasource and bind it to the gridview
            gridview01.DataSource = reader01;
            gridview01.DataBind();
            sqlConn.Close();
        }
        catch (Exception ex)
        {
           //handle Errors
        } //End Try Catch for SQL Operations

这应该从表格中选择值并自动分配列名,除非您的 gridview 已经配置不同。

SQL 查询的字符串附加可能并不理想,但这正是我设置示例块的方式:)

编辑 您需要按如下方式进行声明

//Declare Globally or where you need
        SqlConnection sqlConn = new SqlConnection("ConnString"); //Connection String
        SqlDataReader reader01 = null; //DataReader
                SqlCommand sqlcmd01 = null; 
                String cmdstring = "";

编辑 2 我的 gridview 声明如下(主要是默认值)。我使用的示例使用 .ascx 文件来格式化页面。你的情况可能是类似的。

<asp:GridView ID="gridview01" runat="server" CellPadding="4" 
    EnableModelValidation="True" ForeColor="#333333" GridLines="None" 
    Height="179px" Width="496px" style="margin-right: 0px">
    <AlternatingRowStyle BackColor="White" />
    <EditRowStyle BackColor="#2461BF" />
    <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
    <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
    <RowStyle BackColor="#EFF3FB" HorizontalAlign="Center" />
    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
</asp:GridView>
于 2013-08-20T20:25:41.157 回答