Использование DropDownList в качестве функции подкачки в ASP.Net Formview

У меня есть Formview, который заполняется данными SQL при выборе раскрывающегося списка, но когда я нажимаю «Изменить», он хочет отредактировать первый элемент в раскрывающемся списке, потому что технически он все еще думает, что находится на первой странице. Я хочу, чтобы пейджинг был связан с раскрывающимся списком, но я не совсем уверен, как это сделать. У меня много полей, поэтому я не буду публиковать полный Formview, но вот ключевые части.

Шаблон элемента формы:

<ItemTemplate>
          <table id="FormTable">
          <tr><th>
        <asp:DropDownList ID="ProjectNameDropDown" runat="server" AutoPostBack="true"  
        DataSourceID="SqlDataSource1" 
        DataValueField="Project_Name" name="Text" OnSelectedIndexChanged="ProjectSelect" AppendDataBoundItems="true">              
        <asp:ListItem Text="Select a Project" />
        </asp:DropDownList>
        <asp:Panel ID="Panel1" runat="server" Visible="false">             
          </th>
          <th>
            <asp:Button ID="EditButton" runat="server" CausesValidation="False" 
                CommandName="Edit" Text="Edit" />
            &nbsp;<asp:Button ID="DeleteButton" runat="server" CausesValidation="False" 
                CommandName="Delete" Text="Delete" />
            &nbsp;<asp:Button ID="NewButton" runat="server" CausesValidation="False" 
                CommandName="New" Text="New" />                 
          </th></tr>            
           <tr><th>                
            Business Category:
          </th><td>
            <asp:Label ID="BusinessCategoryLabel" runat="server" 
                Text='<%# Bind("Business_Category") %>'
                 />
            </td></tr>
          <tr><th>
            Project Description:
          </th><td>
            <asp:TextBox ID="ProjectDescriptionLabel" runat="server" ReadOnly="true"
                Text='<%# Bind("Project_Description") %>' TextMode="MultiLine" Rows="5" />
            </td></tr>
          <tr><th>
            Operations Owner:
          </th><td>
            <asp:Label ID="OwnerLabel" runat="server" 
                Text='<%# Bind("Operations_Owner") %>' />
            </td></tr>

Код позади:

protected void ProjectSelect(object sender, EventArgs e)
    {
        DropDownList ProjectNameDropDown = (DropDownList)FormView1.FindControl("ProjectNameDropDown");
        Panel Panel1 = (Panel)FormView1.FindControl("Panel1");
        Label BusinessCategoryLabel = (Label)FormView1.FindControl("BusinessCategoryLabel");
        TextBox ProjectDescriptionLabel = (TextBox)FormView1.FindControl("ProjectDescriptionLabel");
        Label OwnerLabel = (Label)FormView1.FindControl("OwnerLabel");
        Label StakeholderLabel = (Label)FormView1.FindControl("StakeholderLabel");
        Label ReqOrgLabel = (Label)FormView1.FindControl("ReqOrgLabel");
        Label PriorityLabel = (Label)FormView1.FindControl("PriorityLabel");
        Label DateInitiatedLabel = (Label)FormView1.FindControl("DateInitiatedLabel");
        Label ReqCompletionDateLabel = (Label)FormView1.FindControl("ReqCompletionDateLabel");
        Label ProjectLOELabel = (Label)FormView1.FindControl("ProjectLOELabel");
        Label OELabel = (Label)FormView1.FindControl("OELabel");
        Label PELabel = (Label)FormView1.FindControl("PELabel");
        Label EMLabel = (Label)FormView1.FindControl("EMLabel");
        Label PARCHLabel = (Label)FormView1.FindControl("PARCHLabel");
        Label WindowsLabel = (Label)FormView1.FindControl("WindowsLabel");
        Label StorageLabel = (Label)FormView1.FindControl("StorageLabel");
        Label NetworkLabel = (Label)FormView1.FindControl("NetworkLabel");
        Label Unix2Label = (Label)FormView1.FindControl("Unix2Label");
        Label TSGLabel = (Label)FormView1.FindControl("TSGLabel");
        Label SANDLabel = (Label)FormView1.FindControl("SANDLabel");
        Label MOPSLabel = (Label)FormView1.FindControl("MOPSLabel");
        Label ACSROpsLabel = (Label)FormView1.FindControl("ACSROpsLabel");
        Label IMOpsLabel = (Label)FormView1.FindControl("IMOpsLabel");
        Label OSCOpsLabel = (Label)FormView1.FindControl("OSCOpsLabel");
        Label FinancialSvcsLabel = (Label)FormView1.FindControl("FinancialSvcsLabel");
        Label VantageLabel = (Label)FormView1.FindControl("VantageLabel");
        Label VoiceSysOpsLabel = (Label)FormView1.FindControl("VoiceSysOpsLabel");
        Label VoiceAppOpsLabel = (Label)FormView1.FindControl("VoiceAppOpsLabel");
        Label ACPxOpsLabel = (Label)FormView1.FindControl("ACPxOpsLabel");
        Label WFXOpsLabel = (Label)FormView1.FindControl("WFXOpsLabel");
        Label WebOpsLabel = (Label)FormView1.FindControl("WebOpsLabel");
        Label DBALabel = (Label)FormView1.FindControl("DBALabel");
        Label CapacityPlanningLabel = (Label)FormView1.FindControl("CapacityPlanningLabel");
        Label BCPLabel = (Label)FormView1.FindControl("BCPLabel");
        Label DataCenterLabel = (Label)FormView1.FindControl("DataCenterLabel");
        Label GoldsmithLabel = (Label)FormView1.FindControl("GoldsmithLabel");
        Label AmericasITOpsLabel = (Label)FormView1.FindControl("AmericasITOpsLabel");
        Label APACITOpsLabel = (Label)FormView1.FindControl("APACITOpsLabel");
        Label EMEAITOpsLabel = (Label)FormView1.FindControl("EMEAITOpsLabel");

        Panel1.Visible = true;
        if (ProjectNameDropDown.Items.FindByText("Select a Project").Selected != true)
        {




            string myConnectionString = @"Data Source=odcsgwinsql11.devcsg.com\ss2008;Initial Catalog=hulc01;Integrated Security=True";
            SqlConnection myConnection = new SqlConnection(myConnectionString);
            string MySelectQuery = "SELECT * FROM Common WHERE Project_Name = '" + ProjectNameDropDown.SelectedValue + "'";

            using (SqlCommand cmd = new SqlCommand(MySelectQuery))
            {
                cmd.Connection = myConnection;
                myConnection.Open();

                SqlDataAdapter Adapter1 = new SqlDataAdapter(cmd);
                DataSet dset = new DataSet();
                Adapter1.Fill(dset);
                BusinessCategoryLabel.Text = dset.Tables[0].Rows[0]["Business_Category"].ToString();
                ProjectDescriptionLabel.Text = dset.Tables[0].Rows[0]["Project_Description"].ToString();
                OwnerLabel.Text = dset.Tables[0].Rows[0]["Operations_Owner"].ToString();
                StakeholderLabel.Text = dset.Tables[0].Rows[0]["NonOps_Key_Stakeholder"].ToString();
                ReqOrgLabel.Text = dset.Tables[0].Rows[0]["Requesting_Organization"].ToString();
                PriorityLabel.Text = dset.Tables[0].Rows[0]["Priority"].ToString();
                DateInitiatedLabel.Text = dset.Tables[0].Rows[0]["Date_Initiated"].ToString();
                ReqCompletionDateLabel.Text = dset.Tables[0].Rows[0]["Required_Completion_Date"].ToString();
                ProjectLOELabel.Text = dset.Tables[0].Rows[0]["Project_LOE"].ToString();
                OELabel.Text = dset.Tables[0].Rows[0]["OE"].ToString();
                PELabel.Text = dset.Tables[0].Rows[0]["PE"].ToString();
                EMLabel.Text = dset.Tables[0].Rows[0]["EM"].ToString();
                PARCHLabel.Text = dset.Tables[0].Rows[0]["PARCH"].ToString();
                WindowsLabel.Text = dset.Tables[0].Rows[0]["Windows"].ToString();
                StorageLabel.Text = dset.Tables[0].Rows[0]["Storage"].ToString();
                NetworkLabel.Text = dset.Tables[0].Rows[0]["Network"].ToString();
                Unix2Label.Text = dset.Tables[0].Rows[0]["UNIX2"].ToString();
                TSGLabel.Text = dset.Tables[0].Rows[0]["TSG"].ToString();
                SANDLabel.Text = dset.Tables[0].Rows[0]["SAND"].ToString();
                MOPSLabel.Text = dset.Tables[0].Rows[0]["MOPS"].ToString();
                ACSROpsLabel.Text = dset.Tables[0].Rows[0]["ACSR_Ops"].ToString();
                IMOpsLabel.Text = dset.Tables[0].Rows[0]["IM_Ops"].ToString();
                OSCOpsLabel.Text = dset.Tables[0].Rows[0]["OSC_Ops"].ToString();
                FinancialSvcsLabel.Text = dset.Tables[0].Rows[0]["Financial_Svcs"].ToString();
                VantageLabel.Text = dset.Tables[0].Rows[0]["Vantage"].ToString();
                VoiceAppOpsLabel.Text = dset.Tables[0].Rows[0]["Voice_Sys_Ops"].ToString();
                VoiceSysOpsLabel.Text = dset.Tables[0].Rows[0]["Voice_App_Ops"].ToString();
                ACPxOpsLabel.Text = dset.Tables[0].Rows[0]["ACPX_Ops"].ToString();
                WFXOpsLabel.Text = dset.Tables[0].Rows[0]["WFX_Ops"].ToString();
                WebOpsLabel.Text = dset.Tables[0].Rows[0]["Web_Ops"].ToString();
                DBALabel.Text = dset.Tables[0].Rows[0]["DBA"].ToString();
                CapacityPlanningLabel.Text = dset.Tables[0].Rows[0]["Capacity_Planning"].ToString();
                BCPLabel.Text = dset.Tables[0].Rows[0]["BCP"].ToString();
                DataCenterLabel.Text = dset.Tables[0].Rows[0]["Data_Center"].ToString();
                GoldsmithLabel.Text = dset.Tables[0].Rows[0]["Goldsmith"].ToString();
                AmericasITOpsLabel.Text = dset.Tables[0].Rows[0]["Americas_IT_Ops"].ToString();
                APACITOpsLabel.Text = dset.Tables[0].Rows[0]["APAC_IT_Ops"].ToString();
                EMEAITOpsLabel.Text = dset.Tables[0].Rows[0]["EMEA_IT_Ops"].ToString();
            }
        }

Я представляю, как каким-то образом сообщаю Formview, на какую страницу переключаться при выборе из раскрывающегося списка, но я не смог понять код для этого. Спасибо за вашу помощь!


person Chris Hull    schedule 11.10.2011    source источник
comment
На самом деле, какие еще варианты вы могли бы рассказать оригинальному постеру, кроме как в комментарии здесь?   -  person Uwe Keim    schedule 11.10.2011


Ответы (1)


Один из способов сделать это (как я делал это в прошлом) — переместить ваш файл DropDownList с привязкой к данным за пределы файла FormView. Затем привяжите свой FormView к другому SQLDataSource, который зависит от DropDownLists SelectedValue. Таким образом, у вас будет DDL со всеми именами ваших проектов:

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
    DataSourceID="SqlDataSource1" DataTextField="Project_Name" 
    DataValueField="Project_Name">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="Your Connection String" 
    ProviderName="System.Data.SqlClient" 
    SelectCommand="SELECT DISTINCT [Project_Name] FROM [ProjectTable]">
</asp:SqlDataSource>

И FormView, который зависит от того, что выбрано в DDL:

<asp:FormView ID="FormView1" runat="server" AllowPaging="True" 
    DataKeyNames="Project_Name" DataSourceID="SqlDataSource2">
...
</asp:FormView>

<asp:SqlDataSource ID="SqlDataSource2" runat="server" 
    ConnectionString="Your Connection String" 
    ProviderName="System.Data.SqlClient" 
    SelectCommand="SELECT * FROM [ProjectTable] WHERE Project_Name=@Project_Name">
    <SelectParameters>
        <asp:ControlParameter ControlID="DropDownList1" Name="Project_Name" 
            PropertyName="SelectedValue" />
    </SelectParameters>
</asp:SqlDataSource>

Таким образом, когда вы нажимаете кнопку «Редактировать» в своем FormView, вы редактируете запись, которую намеревались редактировать.

В качестве примечания: ваш код программной части делает вас очень уязвимым для SQL-инъекций. Я был бы осторожен с этим. Вместо использования конкатенации строк для создания этого запроса SELECT вы должны использовать параметризованные запросы.

person Josh Darnell    schedule 11.10.2011
comment
Работал отлично. Мне даже не нужен код для заполнения полей. В очередной раз благодарим за помощь! Я все равно планировал заставить MIS исправить все мои недостатки безопасности... =) - person Chris Hull; 12.10.2011
comment
@ Крис Ха-ха, круто. Рад, что смог помочь! - person Josh Darnell; 12.10.2011