Установить выбранное значение выпадающего списка при начальной загрузке страницы - PullRequest
1 голос
/ 22 июля 2010

Ранее я публиковал похожий вопрос, но ни один из ответов не сработал, и я искал в Интернете, пытаясь найти решение. В моей ситуации у меня есть веб-форма «Окно редактирования» с выпадающим списком (Примечание: во избежание путаницы я использую расширения Telerik только для оформления веб-формы):

 <%@ Page Language="VB" CodeFile="EditFormVB.aspx.vb" Inherits="EditFormVB" %>
<%@ Register Namespace="CustomBoundField" TagPrefix="custom" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Edit Pop-up</title>
</head>
<body class="">
    <form id="form1" runat="server">
        <div>

            <script  type="text/javascript">
                function CloseAndRebind(args) {
                    GetRadWindow().BrowserWindow.refreshGrid(args);
                    GetRadWindow().close();
                }

                function GetRadWindow() {
                    var oWindow = null;
                    if (window.radWindow) oWindow = window.radWindow; //Will work in Moz in all cases, including clasic dialog
                    else if (window.frameElement.radWindow) oWindow = window.frameElement.radWindow; //IE (and Moz as well)

                    return oWindow;
                }

                function CancelEdit() {
                    GetRadWindow().close();
                }
            </script>

            <asp:ScriptManager ID="ScriptManager2" runat="server" />
            <telerik:RadFormDecorator ID="RadFormDecorator1" runat="server" Skin="Vista" DecoratedControls="All" />
            <br />
            <br />

            <asp:DetailsView ID="DetailsView1" DataKeyNames="ID" runat="server" AutoGenerateRows="False"
                GridLines="None" DataSourceID="detailsSqlDataSource" Height="50px" Width="125px"
                BorderWidth="0" CellPadding="0" CellSpacing="7">
            <Fields>
                <asp:BoundField DataField="TS_DESCRIPTION" HeaderText="TS_DESCRIPTION" SortExpression="TS_DESCRIPTION" />
                <asp:BoundField DataField="TS_TITLE" HeaderText="TS_TITLE" SortExpression="TS_TITLE" />
                <asp:CommandField ShowEditButton="True" />
                <asp:CommandField ShowInsertButton="True" />
            </Fields>
            </asp:DetailsView>--%>

            <telerik:RadScriptManager ID="RadScriptManager1" runat="server" />
            <telerik:RadFormDecorator ID="RadFormDecorator1" runat="server" Skin="Vista" />
            <br />
            <br />

            <asp:DetailsView ID="DetailsView1" runat="server" Height="400px" Width="745px" 
                AutoGenerateRows="False" DataKeyNames="TS_ID" DataSourceID="SqlDataSource2" 
                EnableModelValidation="True">
                <Fields>

                    <asp:TemplateField HeaderText="Category">
                        <EditItemTemplate>
                            <%--<asp:DropDownList ID="TTCategory" runat="server" DataSourceID="ReqCategoryData" SelectedValue='<%# Bind("TS_NAME") %>' />--%>
                            <asp:DropDownList DataSourceID="ReqCategoryData" DataTextField="ReqCategory" DataValueField="ReqCategory"
                                ID="reqCategoryDropDown" runat="server" AppendDataBoundItems="true" AutoPostBack="true" >                                                            
                            </asp:DropDownList>
                        </EditItemTemplate>
                    </asp:TemplateField>

                    <asp:CommandField ButtonType="Button" EditText="Update" ShowEditButton="True" 
                        ShowCancelButton="True">
                    <ItemStyle HorizontalAlign="Center" />
                    </asp:CommandField>

                </Fields>
            </asp:DetailsView>

        </div>

    </form>
</body>
</html>

А в приведенном ниже коде я устанавливаю источник данных для раскрывающегося списка и использую функцию для запроса в БД имени значения, которое я хочу установить в качестве выбранного значения при начальной загрузке страницы:

Partial Class EditFormVB
    Inherits System.Web.UI.Page

    Public Shared category_Name As String = ""
    Dim ddlDataSource As New SqlDataSource

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        DetailsView1.DefaultMode = DetailsViewMode.Edit
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.Page.Title = "Editing record"

        ''Setup DropDownList SqlDataSource
        ddlDataSource.ID = "ReqCategoryData"
        Page.Controls.Add(ddlDataSource)
        ddlDataSource.ConnectionString = ConfigurationManager.ConnectionStrings("TTPRODReportsQuery").ConnectionString
        ddlDataSource.SelectCommand = "SELECT TS_NAME AS ReqCategory FROM dbo.TS_SELECTIONS WHERE (TS_FLDID = 5299 AND TS_STATUS = 0) ORDER BY TS_NAME"
        Dim args As New DataSourceSelectArguments
        ddlDataSource.Select(args)

        ''Set max length of Title field to 70 characters
        Dim dvrTest As DetailsViewRowCollection = DetailsView1.Rows
        Dim TitleTB As TextBox = dvrTest.Item(0).Cells(1).Controls(0)
        TitleTB.Attributes.Add("onkeydown", "isMaxLen(this)")
        TitleTB.Attributes.Add("maxlength", "70")

        Dim myDDL As DropDownList = DetailsView1.FindControl("reqCategoryDropDown")
        ''Perform dropdown list population operations
        If Page.IsPostBack = False Then
            Dim ticket_ID As String = getDataKey(DetailsView1)
            ''Fetch Category ID
            Dim sqlText As String = "SELECT TS_REQCATEGORY FROM USR_ITFAC WHERE (TS_ID = " + ticket_ID + ") "
            Dim reqDataReader As SqlDataReader = GetDataReader(sqlText)
            reqDataReader.Read()
            Dim category_ID As String = reqDataReader(0)

            ''Fetch Category name using the categoryID and set as selected value in dropdown list
            sqlText = "SELECT TS_NAME FROM TS_SELECTIONS WHERE (TS_ID = " + category_ID + ") "
            reqDataReader = GetDataReader(sqlText)
            reqDataReader.Read()
            category_Name = reqDataReader(0)
            myDDL.DataBind()
            myDDL.Selectedvalue = category_Name //<--this value gets set only when debugging, 
        End If

    End Sub

    Private Function GetDataReader(ByVal sqlText As String) As SqlDataReader
        Dim dr As SqlDataReader
        Dim sqlConn As SqlConnection = New SqlConnection(ConfigurationManager.ConnectionStrings("TTPRODReportsQuery").ConnectionString)
        sqlConn.Open()
        Dim sqlCmd As SqlCommand = New SqlCommand(sqlText, sqlConn)
        dr = sqlCmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)
        Return dr
    End Function

End Class

Выпадающий список заполняется надлежащим образом, однако, когда я пытаюсь установить значение, он не отражает загрузку страницы; выпадающий список просто заполняется, и в разметке не выбрано значение, поэтому первое значение отображается по умолчанию. Странно то, что когда я отлаживаюсь, значение, кажется, устанавливается, когда я прохожу через функцию, как будто выбранное значение сбрасывается, как только функция завершается и продолжает загружать страницу. Любая помощь или понимание приветствуется

РЕШЕНИЕ: Пришлось добавить отдельную функцию, которая вызывается onLoad из DropDownList после того, как будет завершено выполнение после Page_Load. Все еще не решена причина, по которой DropDownList перепривязывается после Page_Load.

В HTML:

<asp:DropDownList DataSourceID="ReqCategoryData" DataTextField="ReqCategory" DataValueField="ReqCategory"
                                ID="reqCategoryDropDown" runat="server" AutoPostBack="true" OnLoad="DDL_DataBound">  

IN CODE-BEHIND

Public Shared category_Name As String = ""

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.Page.Title = "Editing record"

        ''Setup DropDownList SqlDataSource
        ddlDataSource.ID = "ReqCategoryData"
        Page.Controls.Add(ddlDataSource)
        ddlDataSource.ConnectionString = ConfigurationManager.ConnectionStrings("TTPRODReportsQuery").ConnectionString
        ddlDataSource.SelectCommand = "SELECT TS_NAME AS ReqCategory FROM dbo.TS_SELECTIONS WHERE (TS_FLDID = 5299 AND TS_STATUS = 0) ORDER BY TS_NAME"
        Dim args As New DataSourceSelectArguments
        ddlDataSource.Select(args)

        ''Set max length of Title field to 70 characters
        Dim dvrTest As DetailsViewRowCollection = DetailsView1.Rows
        Dim TitleTB As TextBox = dvrTest.Item(0).Cells(1).Controls(0)
        TitleTB.Attributes.Add("onkeydown", "isMaxLen(this)")
        TitleTB.Attributes.Add("maxlength", "70")

        Dim myDDL As DropDownList = DetailsView1.FindControl("reqCategoryDropDown")
        ''Perform dropdown list population operations
        If Page.IsPostBack = False Then
            Dim ticket_ID As String = getDataKey(DetailsView1)
            ''Fetch Category ID
            Dim sqlText As String = "SELECT TS_REQCATEGORY FROM USR_ITFAC WHERE (TS_ID = " + ticket_ID + ") "
            Dim reqDataReader As SqlDataReader = GetDataReader(sqlText)
            reqDataReader.Read()
            Dim category_ID As String = reqDataReader(0)

            ''Fetch Category name using the categoryID and set as selected value in dropdown list
            sqlText = "SELECT TS_NAME FROM TS_SELECTIONS WHERE (TS_ID = " + category_ID + ") "
            reqDataReader = GetDataReader(sqlText)
            reqDataReader.Read()
            category_Name = reqDataReader(0)
            myDDL.DataBind()
        End If
    End Sub


        Protected Sub DDL_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
            If Page.IsPostBack = False Then
                Dim myDDL As DropDownList = DetailsView1.FindControl("reqCategoryDropDown")
                myDDL.Items.FindByValue(category_Name).Selected = True
            End If
        End Sub

1 Ответ

2 голосов
/ 22 июля 2010

В целях безопасности вы можете нажать на DetailsView_DataBound и поместить туда свой код выбора.Я думаю, что, возможно, управление источником данных снова связывает и стирает ваш выбор ...

...