DropDownList的回传后,所有值/指数下跌 [英] DropDownList after postback all values/index lost

查看:133
本文介绍了DropDownList的回传后,所有值/指数下跌的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到一个GridView和一个DropDownList一个小问题。我能得到的DropDownList最初加载,但当它的AutoPostBack是它没有价值的回报。我填充在RowEditing子DropDownList的。我猜,我必须以某种方式重新绑定中的RowDataBound子,但不知道如何去做。如果我试图找到该控件的SelectedValue的我落得一无所有。

VB code

 保护小组的Page_Load(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手Me.Load
  如果没有的IsPostBack然后
    bindGridView()
  万一
结束小组
菜单点击bindGridView
公用Sub bindGridView(可选BYVAL sortExp的String =,可选BYVAL sortDir的String =)
  昏暗strConnString作为字符串= ConfigurationManager.ConnectionStrings(WEBConnectionString)。的ConnectionString
  昏暗康恩作为的SqlConnection =新的SqlConnection(strConnString)
  conn.Open()
  昏暗strProgramNumber作为字符串= 5
  昏暗strRecordType作为字符串=输入源
  昏暗strProgramInformation作为字符串=\\\\路径\\为\\文件
  昏暗的SQL作为字符串
  DIM CMD作为的SqlCommand =新的SqlCommand()
  cmd.Connection =康恩
  如果sortExp<>随后的String.Empty
    sortExp =(sortExp&放大器;&放大器; sortDir)的ToString
    SQL =SELECT tblPrgTrackPrograms.ProgramNumber,与& _
          tblPrgTrackPrograms.ProgramName,与& _
          tblPrgTrackPrograms.ProgramStatus,与& _
          tblPrgTrackProgramDocumentation.RecordType,与& _
          tblPrgTrackProgramDocumentation.ProgramInformation与& _
          FROM tblPrgTrackPrograms INNER JOIN tblPrgTrackProgramDocumentation ON&放大器; _
          tblPrgTrackPrograms.ProgramNumber = tblPrgTrackProgramDocumentation.ProgramNumber ORDER BY&放大器; _
          @sortExp
    cmd.Parameters.AddWithValue(sortExp,sortExp)  其他
    SQL =SELECT tblPrgTrackPrograms.ProgramNumber,与& _
          tblPrgTrackPrograms.ProgramName,与& _
          tblPrgTrackPrograms.ProgramStatus,与& _
          tblPrgTrackProgramDocumentation.RecordType,与& _
          tblPrgTrackProgramDocumentation.ProgramInformation与& _
          FROM tblPrgTrackPrograms INNER JOIN tblPrgTrackProgramDocumentation ON&放大器; _
          tblPrgTrackPrograms.ProgramNumber = tblPrgTrackProgramDocumentation.ProgramNumber
  万一
  cmd.CommandText = SQL
  昏暗myDataSet作为新的数据集()
  昏暗mySQLAdapter作为新的SqlDataAdapter(CMD)
  mySQLAdapter.SelectCommand.Connection =康恩
  mySQLAdapter.Fill(myDataSet)
  conn.Close()
  gvProgramDetails.DataSource = myDataSet
  gvProgramDetails.DataBind()
结束小组
ProgramDetails负载
保护小组gvProgramDetails_Load(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手gvProgramDetails.Load
  bindGridView()
结束小组
ProgramDetails分页
保护小组gvProgramDetails_PageIndexChanging(BYVAL发件人为对象,BYVAL E上System.Web.UI.WebControls.GridViewPageEventArgs)处理gvProgramDetails.PageIndexChanging
  gvProgramDetails.PageIndex = e.NewPageIndex
  bindGridView()
结束小组
ProgramDetails排序
保护小组gvProgramDetails_Sorting(BYVAL发件人为对象,BYVAL E上System.Web.UI.WebControls.GridViewSortEventArgs)处理gvProgramDetails.Sorting
  昏暗SortDirection作为字符串
  如果会议(SortDirection)= vbNullString然后
    会议(SortDirection)=DESC
  其他
    SortDirection =会议(SortDirection)。的ToString
    如果SortDirection =ASC然后
        SortDirection =DESC
    elseif的SortDirection =DESC然后
        SortDirection =ASC
    其他
        SortDirection =ASC
    万一
    bindGridView(e.SortEx pression,会议(SortDirection))
    需要存储在视图状态中的排序信息
    会议(SortDirection)= SortDirection
  万一
结束小组ProgramDetails RowEditing
保护小组gvProgramDetails_RowEditing(BYVAL发件人为对象,BYVAL E上System.Web.UI.WebControls.GridViewEditEventArgs)处理gvProgramDetails.RowEditing
  昏暗的LBL作为标签= CTYPE(gvProgramDetails.Rows(e.NewEditIndex).FindControl(lblRecordType),标签)
  昏暗strValue中的String = lbl.Text
  gvProgramDetails.EditIndex = e.NewEditIndex
  bindGridView()
  昏暗行作为GridViewRow = gvProgramDetails.Rows(e.NewEditIndex)
  昏暗strConnString作为字符串= ConfigurationManager.ConnectionStrings(CSPaperWEBConnectionString)。的ConnectionString
  昏暗ddlRecordType作为DropDownList的= CTYPE(row.FindControl(ddlRecordType),DropDownList的)
  昏暗康恩作为的SqlConnection =新的SqlConnection(strConnString)
  conn.Open()
  昏暗的SQL作为字符串
  DIM CMD作为的SqlCommand =新的SqlCommand()
  cmd.Connection =康恩
  SQL =从[tblPrgTrackValidRecordTypes]中选择记录类型
  cmd.CommandText = SQL
  昏暗myDataSet作为新的数据集()
  昏暗mySQLAdapter作为新的SqlDataAdapter(CMD)
  mySQLAdapter.SelectCommand.Connection =康恩
  mySQLAdapter.Fill(myDataSet)
  conn.Close()
  如果ddlRecordType状态并没有任何再
    ddlRecordType.DataTextField =记录类型
    ddlRecordType.DataValueField =记录类型
    ddlRecordType.DataSource = myDataSet
    ddlRecordType.SelectedValue = strValue中
    ddlRecordType.DataBind()
  万一
结束小组
保护小组gvProgramDetails_RowDataBound(BYVAL发件人为对象,BYVAL E上System.Web.UI.WebControls.GridViewRowEventArgs)处理gvProgramDetails.RowDataBound
  如果e.Row.RowType = DataControlRowType.DataRow然后
    昏暗的Ctrl键控制= e.Row.FindControl(ddlRecordType)
    如果CTRL状态并没有任何再
      昏暗ddlRecordType作为DropDownList的= CTRL
      MSGBOX(ddlRecordType.SelectedValue)    万一
  万一
结束小组
ProgramDetails RowUpdating
保护小组gvProgramDetails_RowUpdating(BYVAL发件人为对象,BYVAL E上System.Web.UI.WebControls.GridViewUpdateEventArgs)处理gvProgramDetails.RowUpdating
  昏暗ddlRecordType作为DropDownList的= gvProgramDetails.Rows(e.RowIndex).FindControl(ddlRecordType)
  MSGBOX(ddlRecordType.SelectedValue)
  gvProgramDetails.EditIndex = -1
  bindGridView()
结束小组
ProgramDetails RowCancelingEdit
保护小组gvProgramDetails_RowCancelingEdit1(BYVAL发件人为对象,BYVAL E上System.Web.UI.WebControls.GridViewCancelEditEventArgs)处理gvProgramDetails.RowCancelingEdit
  gvProgramDetails.EditIndex = -1
  bindGridView()
结束小组
ProgramDetails RowDeleting
保护小组gvProgramDetails_RowDeleting(BYVAL发件人为对象,BYVAL E上System.Web.UI.WebControls.GridViewDeleteEventArgs)处理gvProgramDetails.RowDeleting
  昏暗strConnString作为字符串= ConfigurationManager.ConnectionStrings(WEBConnectionString)。的ConnectionString
  昏暗康恩作为的SqlConnection =新的SqlConnection(strConnString)
  conn.Open()
  昏暗strProgramNumber作为字符串= 5
  昏暗strRecordType作为字符串=输入源
  昏暗strProgramInformation作为字符串=\\\\路径\\为\\文件
  昏暗的SQL作为字符串=从tblPrgTrackProgramDocumentation删去ProgramNumber = @ProgramNumber和记录类型= @RecordType和的ProgramInformation = @ProgramInformation
  DIM CMD作为的SqlCommand =新的SqlCommand()
  cmd.Connection =康恩
  cmd.CommandText = SQL
  cmd.Parameters.AddWithValue(ProgramNumber,strProgramNumber)
  cmd.Parameters.AddWithValue(记录类型,strRecordType)
  cmd.Parameters.AddWithValue(的ProgramInformation,strProgramInformation)
  cmd.ExecuteNonQuery()
  cmd.Dispose()
  bindGridView()
结束小组

ASP前端

 < AJX:的UpdatePanel ID =类AjaxPanel=服务器>
  <&的ContentTemplate GT;
    < ASP:GridView控件ID =gvProgramDetails=服务器的AutoGenerateColumns =FALSE
    的CssClass =GridView控件的DataKeyNames =ProgramNumberAllowPaging =真每页=3AllowSorting =真>
      <柱体和GT;
        < ASP:的TemplateField ShowHeader =FALSE>
          <&ItemTemplate中GT;
            < ASP:LinkBut​​ton的ID =LinkBut​​ton1=服务器的CausesValidation =FALSE
            的CommandName =删除文本=删除的OnClientClick =返回确认('您确定要删除此记录');>< / ASP:LinkBut​​ton的>
          < / ItemTemplate中>
          <&EditItemTemplate的GT;
          < / EditItemTemplate中>
          < ControlStyle的CssClass =按钮来删除/>
        < / ASP:的TemplateField>
        < ASP:CommandField中ControlStyle-的CssClass =按钮来保存ShowEditButton =真>
          < ControlStyle的CssClass =按钮来保存/>
        < / ASP:CommandField中>
        < ASP:BoundField的数据字段=ProgramNumber的HeaderText =ProgramNumber
          InsertVisible =FALSE只读=真SORTEX pression =ProgramNumber/>
        < ASP:BoundField的数据字段=ProgramName中的HeaderText =ProgramName中只读=真
          SORTEX pression =ProgramName中/>
        < ASP:BoundField的数据字段=ProgramStatus的HeaderText =ProgramStatus只读=真
          SORTEX pression =ProgramStatus/>
        < ASP:的TemplateField的HeaderText =记录类型SORTEX pression =记录类型>
          <&EditItemTemplate的GT;
            < ASP:DropDownList的ID =ddlRecordType=服务器的AutoPostBack =真>
            < / ASP:DropDownList的>
          < / EditItemTemplate中>
          <&ItemTemplate中GT;
            < ASP:标签ID =lblRecordType=服务器文本='<%#绑定(记录类型)%>'>< / ASP:标签>
          < / ItemTemplate中>
        < / ASP:的TemplateField>
        < ASP:BoundField的数据字段=的ProgramInformation的HeaderText =的ProgramInformation
          SORTEX pression =的ProgramInformation/>
      < /专栏>
    < / ASP:GridView的>
    < ASP:SqlDataSource的ID =SqlDataSource2=服务器的ConnectionString =<%$的ConnectionStrings:WEBConnectionString%>中
    的SelectCommand =SELECT * FROM [tblPrgTrackValidRecordTypes]>< / ASP:SqlDataSource的>
  < /&的ContentTemplate GT;
< / AJX:的UpdatePanel>

对于那些你们谁回答从工具箱中拖动控制,创建数据源,并设置绑定(记录类型),请不要。我尝试了这种方式和价值总是会回来后与任何记录类型了。所以,除非你能解决这个gridview的该版本不使用拖/放控制解决方案。我抓我的大脑来解决这一个。


更新


我下APP_ code工艺/ ddlRecordType.vb

创建

 进口Microsoft.VisualBasic程序
命名空间processes.ProgramTrack.dllRecordType
   公共类ddlRecordType
        公用Sub ddlRecordType()        结束小组
        公共职能GetRecords()作为数据集
            昏暗康恩作为新的SqlConnection
            DIM CMD作为新的SqlCommand
            conn.ConnectionString = ConfigurationManager.ConnectionStrings(WEBConnectionString)。ConnectionString.ToString
            cmd.CommandText =从[tblPrgTrackValidRecordTypes]记录类型
            cmd.Connection =康恩
            昏暗myDataSet作为新的数据集()
            昏暗mySQLAdapter作为新的SqlDataAdapter(CMD)
            mySQLAdapter.Fill(myDataSet)
            返回myDataSet
        结束功能
    末级
最终命名空间

我的标记,然后看起来是这样的。

 < ASP:DropDownList的ID =ddlRecordType的DataSourceID =odsRecordTypeDataTextField =记录类型DataValueField =记录类型=服务器的AutoPostBack =真> < / ASP:DropDownList的>
< ASP:ObjectDataSource控件ID =odsRecordType=服务器的TypeName =processes.ProgramTrack.dllRecordType.ddlRecordTypeSelectMethod =GetRecords>< / ASP:ObjectDataSource控件>

然后我得到同样的问题,因为之前对DDL不保持它在回传值。我应该开始一个新的问题或继续使用这一个?

更新来修复DDL不维护。禁用视图状态为GridView。

 < ASP:GridView控件ID =gvProgramDetails=服务器的AutoGenerateColumns =FALSE的CssClass =GridView控件的DataKeyNames =ProgramNumberAllowPaging =真每页= 10的EnableViewState =假AllowSorting =真>


解决方案

尝试创建的DDL一个ObjectDataSource,并使用它。的问题是,DDL具有页负载被初始化,或者在页初始化,或通过一个数据源的控制。如果你不使用的Ajax的UpdatePanel(勇往直前,把它拿出来,看你的code的工作,它应该反正),那么你就能够做到这一点是这样的。

如果你引入一个ObjectDataSource(你也可以传递参数给它),那么你应该结束了,你想要什么。

编辑:

我要在我的一个项目提供code,所以你可以看到我是如何使用它。这code不会是完美的,以您的需求,但会告诉你怎么做你想做的。

 命名空间Appropriate.Namespace.Here {
  公共类的MyType {
    公开名单< KeyValuePair<字符串,字符串>> GetRoles(){
      清单< KeyValuePair<字符串,字符串>> L =新的List< KeyValuePair<字符串,字符串>>();      l.Add(新KeyValuePair<字符串,字符串>(1级,分析师));
      l.Add(新KeyValuePair<字符串,字符串>(级别2,客户服务));
      l.Add(新KeyValuePair<字符串,字符串>(Level3的,客户服务经理));
      l.Add(新KeyValuePair<字符串,字符串>(级别4,完全访问用户));
      l.Add(新KeyValuePair<字符串,字符串>(LEVEL5,超级用户));      返回升;
    }
  }
}< ASP:DropDownList的ID =cmbRoles=服务器的AutoPostBack =FALSE的DataSourceID =odsRolesDataTextField =值DataValueField =键/>
< ASP:ObjectDataSource控件ID =odsRoles=服务器的TypeName =Appropriate.Namespace.Here.MyTypeSelectMethod =GetRoles/>

请注意命名空间和类型名称如何协同工作给我的 SelectMethod ?我不是在选择参数提供一个覆盖,本书虽然你可以。你会做,在页面的后盾code,我可以给上一些有识之士为好,但我想不完全是过于复杂。

请注意,我是如何从方法返回一个列表?而我只是将其定义在该方法?你可以很容易地做一个数据库调用那里。

I'm running into a little problem with a gridview and a dropdownlist. I can get the dropdownlist to load initially, but when it autopostback's it returns with no value. I am populating the dropdownlist in the RowEditing sub. I'm guessing that I must somehow rebind in the RowDataBound sub, but don't know how to go about it. If I try to find the control's SelectedValue I end up with nothing.

VB Code

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  If Not IsPostBack Then
    bindGridView()
  End If
End Sub
'Menu Click

'bindGridView
Public Sub bindGridView(Optional ByVal sortExp As String = "", Optional ByVal sortDir As String = "")
  Dim strConnString As String = ConfigurationManager.ConnectionStrings("WEBConnectionString").ConnectionString
  Dim conn As SqlConnection = New SqlConnection(strConnString)
  conn.Open()
  Dim strProgramNumber As String = 5
  Dim strRecordType As String = "Input Source"
  Dim strProgramInformation As String = "\\path\to\file"
  Dim sql As String
  Dim cmd As SqlCommand = New SqlCommand()
  cmd.Connection = conn
  If sortExp <> String.Empty Then
    sortExp = (sortExp & " " & sortDir).ToString
    sql = "SELECT tblPrgTrackPrograms.ProgramNumber, " & _
          "tblPrgTrackPrograms.ProgramName, " & _
          "tblPrgTrackPrograms.ProgramStatus, " & _
          "tblPrgTrackProgramDocumentation.RecordType, " & _
          "tblPrgTrackProgramDocumentation.ProgramInformation  " & _
          "FROM tblPrgTrackPrograms INNER JOIN tblPrgTrackProgramDocumentation ON " & _
          "tblPrgTrackPrograms.ProgramNumber = tblPrgTrackProgramDocumentation.ProgramNumber ORDER BY " & _
          "@sortExp"
    cmd.Parameters.AddWithValue("sortExp", sortExp)

  Else
    sql = "SELECT tblPrgTrackPrograms.ProgramNumber, " & _
          "tblPrgTrackPrograms.ProgramName, " & _
          "tblPrgTrackPrograms.ProgramStatus, " & _
          "tblPrgTrackProgramDocumentation.RecordType, " & _
          "tblPrgTrackProgramDocumentation.ProgramInformation  " & _
          "FROM tblPrgTrackPrograms INNER JOIN tblPrgTrackProgramDocumentation ON " & _
          "tblPrgTrackPrograms.ProgramNumber = tblPrgTrackProgramDocumentation.ProgramNumber"
  End If
  cmd.CommandText = sql
  Dim myDataSet As New DataSet()
  Dim mySQLAdapter As New SqlDataAdapter(cmd)
  mySQLAdapter.SelectCommand.Connection = conn
  mySQLAdapter.Fill(myDataSet)
  conn.Close()
  gvProgramDetails.DataSource = myDataSet
  gvProgramDetails.DataBind()
End Sub
'ProgramDetails Load
Protected Sub gvProgramDetails_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles gvProgramDetails.Load
  bindGridView()
End Sub
'ProgramDetails Paging
Protected Sub gvProgramDetails_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles gvProgramDetails.PageIndexChanging
  gvProgramDetails.PageIndex = e.NewPageIndex
  bindGridView()
End Sub
'ProgramDetails Sorting
Protected Sub gvProgramDetails_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gvProgramDetails.Sorting
  Dim SortDirection As String
  If Session("SortDirection") = vbNullString Then
    Session("SortDirection") = "DESC"
  Else
    SortDirection = Session("SortDirection").ToString
    If SortDirection = "ASC" Then
        SortDirection = "DESC"
    ElseIf SortDirection = "DESC" Then
        SortDirection = "ASC"
    Else
        SortDirection = "ASC"
    End If
    bindGridView(e.SortExpression, Session("SortDirection"))
    'Need to store sort info in view state    
    Session("SortDirection") = SortDirection
  End If
End Sub

'ProgramDetails RowEditing
Protected Sub gvProgramDetails_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles gvProgramDetails.RowEditing
  Dim lbl As Label = CType(gvProgramDetails.Rows(e.NewEditIndex).FindControl("lblRecordType"), Label)
  Dim strValue As String = lbl.Text
  gvProgramDetails.EditIndex = e.NewEditIndex
  bindGridView()
  Dim row As GridViewRow = gvProgramDetails.Rows(e.NewEditIndex)
  Dim strConnString As String = ConfigurationManager.ConnectionStrings("CSPaperWEBConnectionString").ConnectionString
  Dim ddlRecordType As DropDownList = CType(row.FindControl("ddlRecordType"), DropDownList)
  Dim conn As SqlConnection = New SqlConnection(strConnString)
  conn.Open()
  Dim sql As String
  Dim cmd As SqlCommand = New SqlCommand()
  cmd.Connection = conn
  sql = "select RecordType from [tblPrgTrackValidRecordTypes] "
  cmd.CommandText = sql
  Dim myDataSet As New DataSet()
  Dim mySQLAdapter As New SqlDataAdapter(cmd)
  mySQLAdapter.SelectCommand.Connection = conn
  mySQLAdapter.Fill(myDataSet)
  conn.Close()
  If ddlRecordType IsNot Nothing Then
    ddlRecordType.DataTextField = "RecordType"
    ddlRecordType.DataValueField = "RecordType"
    ddlRecordType.DataSource = myDataSet
    ddlRecordType.SelectedValue = strValue
    ddlRecordType.DataBind()
  End If
End Sub
Protected Sub gvProgramDetails_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvProgramDetails.RowDataBound
  If e.Row.RowType = DataControlRowType.DataRow Then
    Dim ctrl As Control = e.Row.FindControl("ddlRecordType")
    If ctrl IsNot Nothing Then
      Dim ddlRecordType As DropDownList = ctrl
      MsgBox(ddlRecordType.SelectedValue)

    End If
  End If
End Sub
'ProgramDetails RowUpdating
Protected Sub gvProgramDetails_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles gvProgramDetails.RowUpdating
  Dim ddlRecordType As DropDownList = gvProgramDetails.Rows(e.RowIndex).FindControl("ddlRecordType")
  MsgBox(ddlRecordType.SelectedValue)
  gvProgramDetails.EditIndex = -1
  bindGridView()
End Sub
'ProgramDetails RowCancelingEdit
Protected Sub gvProgramDetails_RowCancelingEdit1(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles gvProgramDetails.RowCancelingEdit
  gvProgramDetails.EditIndex = -1
  bindGridView()
End Sub
'ProgramDetails RowDeleting
Protected Sub gvProgramDetails_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles gvProgramDetails.RowDeleting
  Dim strConnString As String = ConfigurationManager.ConnectionStrings("WEBConnectionString").ConnectionString
  Dim conn As SqlConnection = New SqlConnection(strConnString)
  conn.Open()
  Dim strProgramNumber As String = 5
  Dim strRecordType As String = "Input Source"
  Dim strProgramInformation As String = "\\path\to\file"
  Dim sql As String = "delete from tblPrgTrackProgramDocumentation where ProgramNumber = @ProgramNumber and RecordType = @RecordType and ProgramInformation = @ProgramInformation"
  Dim cmd As SqlCommand = New SqlCommand()
  cmd.Connection = conn
  cmd.CommandText = sql
  cmd.Parameters.AddWithValue("ProgramNumber", strProgramNumber)
  cmd.Parameters.AddWithValue("RecordType", strRecordType)
  cmd.Parameters.AddWithValue("ProgramInformation", strProgramInformation)
  cmd.ExecuteNonQuery()
  cmd.Dispose()
  bindGridView()
End Sub

ASP front end

<ajx:UpdatePanel ID="ajaxpanel" runat="server">   
  <ContentTemplate>        
    <asp:GridView ID="gvProgramDetails" runat="server" AutoGenerateColumns="False" 
    CssClass="gridview" DataKeyNames="ProgramNumber" AllowPaging="True" PageSize="3" AllowSorting="True" >
      <Columns>
        <asp:TemplateField ShowHeader="False">
          <ItemTemplate>
            <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" 
            CommandName="Delete" Text="Delete" OnClientClick="return confirm('Are you sure you want to delete this record');"></asp:LinkButton>
          </ItemTemplate>
          <EditItemTemplate>
          </EditItemTemplate>
          <ControlStyle CssClass="button delete" />
        </asp:TemplateField>
        <asp:CommandField ControlStyle-CssClass="button save" ShowEditButton="True">
          <ControlStyle CssClass="button save" />
        </asp:CommandField>
        <asp:BoundField DataField="ProgramNumber" HeaderText="ProgramNumber" 
          InsertVisible="False" ReadOnly="True" SortExpression="ProgramNumber" />
        <asp:BoundField DataField="ProgramName" HeaderText="ProgramName" ReadOnly="True"
          SortExpression="ProgramName" />
        <asp:BoundField DataField="ProgramStatus" HeaderText="ProgramStatus" ReadOnly="True"
          SortExpression="ProgramStatus" />
        <asp:TemplateField HeaderText="RecordType" SortExpression="RecordType">
          <EditItemTemplate>
            <asp:DropDownList ID="ddlRecordType"  runat="server" autopostback="True">
            </asp:DropDownList>
          </EditItemTemplate>
          <ItemTemplate>
            <asp:Label ID="lblRecordType" runat="server" Text='<%# Bind("RecordType") %>'></asp:Label>
          </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="ProgramInformation" HeaderText="ProgramInformation" 
          SortExpression="ProgramInformation" />
      </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:WEBConnectionString %>"
    SelectCommand="SELECT * FROM [tblPrgTrackValidRecordTypes]"></asp:SqlDataSource>
  </ContentTemplate>
</ajx:UpdatePanel>

For those of you who answer drag the control in from the toolbox, create datasource, and set bind("RecordType") please don't. I've tried it that way and the value would always post back with whatever Recordtype was. So unless if you can solve that version of this gridview don't use drag/drop control solution. I'm scratching my brain to solve this one.


Update


I created under App_Code Process/ddlRecordType.vb

Imports Microsoft.VisualBasic
Namespace processes.ProgramTrack.dllRecordType
   Public Class ddlRecordType
        Public Sub ddlRecordType()

        End Sub
        Public Function GetRecords() As DataSet
            Dim conn As New SqlConnection
            Dim cmd As New SqlCommand
            conn.ConnectionString = ConfigurationManager.ConnectionStrings("WEBConnectionString").ConnectionString.ToString
            cmd.CommandText = "select RecordType from [tblPrgTrackValidRecordTypes] "
            cmd.Connection = conn
            Dim myDataSet As New DataSet()
            Dim mySQLAdapter As New SqlDataAdapter(cmd)
            mySQLAdapter.Fill(myDataSet)
            Return myDataSet
        End Function
    End Class
End Namespace

My markup then looks like this.

<asp:DropDownList ID="ddlRecordType" DatasourceID="odsRecordType" DataTextField="RecordType" DataValueField="RecordType" runat="server" autopostback="True"   >                          </asp:DropDownList>                                     
<asp:ObjectDataSource ID="odsRecordType" runat="server" TypeName="processes.ProgramTrack.dllRecordType.ddlRecordType" SelectMethod="GetRecords"></asp:ObjectDataSource> 

Then I get the same problem as before about the DDL not maintaining it's value at postback. Should I start a new Question or continue with this one?

Update to fix the DDL not maintaining. Disable Viewstate for the gridview.

<asp:GridView ID="gvProgramDetails" runat="server" AutoGenerateColumns="False" CssClass="gridview"DataKeyNames="ProgramNumber" AllowPaging="True" PageSize="10" EnableViewState="False" AllowSorting="True">

解决方案

Try creating an objectDataSource for the DDL, and use that. The problem is that the DDL has to be initialized at page load, or on page init, OR via a DataSource control. If you weren't using the Ajax UpdatePanel (go ahead, take it out, watch your code work, it should anyways) then you would be able to do it like this.

If you'll introduce an ObjectDataSource (and you can pass parameters to it too) then you should end up with what you want.

Edit:

I'm going to provide code from a project of mine, so that you can see how I'm using it. This code will not be perfect to your needs, but will show you how to do what you want.

namespace Appropriate.Namespace.Here {
  public class MyType {
    public List<KeyValuePair<string, string>> GetRoles() {
      List<KeyValuePair<string, string>> l = new List<KeyValuePair<string, string>>();

      l.Add( new KeyValuePair<string, string>( "Level1", "Analyst" ) );
      l.Add( new KeyValuePair<string, string>( "Level2", "Customer Service" ) );
      l.Add( new KeyValuePair<string, string>( "Level3", "Customer Service Manager" ) );
      l.Add( new KeyValuePair<string, string>( "Level4", "Full-Access User" ) );
      l.Add( new KeyValuePair<string, string>( "Level5", "Super User" ) );

      return l;
    }
  }
}

<asp:DropDownList ID="cmbRoles" runat="server" AutoPostBack="False" DataSourceID="odsRoles" DataTextField="Value" DataValueField="Key" />
<asp:ObjectDataSource ID="odsRoles" runat="server" TypeName="Appropriate.Namespace.Here.MyType" SelectMethod="GetRoles" />

Notice how the namespace and typename work together to give me the SelectMethod? I'm not providing an override on the select parameters, altho you could. You would do that in the page backing code, and I could give some insight on that as well, but I'm trying to not be entirely overly complex.

Notice how I'm returning a List from the method? And I'm just defining it in that method? You could just as easily do a database call there.

这篇关于DropDownList的回传后,所有值/指数下跌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆