2010-07-22 2 views
1

Ранее я опубликовал аналогичный вопрос, но ни один из ответов не работал, и я просматривал все веб-страницы, пытаясь найти решение. Моя ситуация, у меня есть веб-формы Edit Window с DropDownList (Примечание: чтобы избежать путаницы, я использую расширения 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> 

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

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 

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

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

В HTML:

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

В КОД-ЗА

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 

ответ

2

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

+0

Эй, Брайан, как именно я вдавливаю в DetailsView_Databound из кода? Не могли бы вы предоставить некоторые подробности? Спасибо – kingrichard2005

+0

Создал и использовал функцию DetailsView_Databound, но все еще не работал. – kingrichard2005

+0

ОК, с новым кодом, вы могли бы обновить образец кода выше, чтобы я мог видеть, как выглядит новый код? Как правило, причиной возникновения ошибки является то, что что-то позже в этом процессе: 1) восстанавливает источник данных, потенциально очищает источник данных или 2) устанавливает значение что-то еще, или 3) код привязки работает на каждом загрузка страницы и значения не сохраняются при обратной передаче. –

Смежные вопросы