0

グリッドビューとドロップダウンリストで少し問題が発生しています。ドロップダウンリストを最初にロードすることはできますが、自動ポストバックすると値なしで返されます。RowEditingサブのドロップダウンリストにデータを入力しています。RowDataBoundサブで何らかの方法で再バインドする必要があると思いますが、その方法がわかりません。コントロールのSelectedValueを見つけようとすると、何も表示されません。

VBコード

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フロントエンド

<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>

ツールボックスからコントロールをドラッグインし、データソースを作成し、bind( "RecordType")を設定すると答えた方は、しないでください。私はそれをそのように試しましたが、値は常にレコードタイプが何であれポストバックされます。したがって、このグリッドビューのそのバージョンを解決できる場合を除いて、ドラッグ/ドロップ制御ソリューションを使用しないでください。私はこれを解決するために私の脳を引っ掻いています。


アップデート


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

マークアップは次のようになります。

<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> 

次に、DDLがポストバックでその値を維持しないことについて以前と同じ問題が発生します。新しい質問を開始する必要がありますか、それともこの質問を続行する必要がありますか?

更新して、DDLが維持されない問題を修正します。グリッドビューのビューステートを無効にします。

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

1 に答える 1

0

DDLのobjectDataSourceを作成してみて、それを使用してください。問題は、ページのロード時、ページの初期化時、またはDataSourceコントロールを介してDDLを初期化する必要があることです。Ajax UpdatePanelを使用していなかった場合(先に進んで、それを取り出し、コードが機能することを確認してください)、このように実行できます。

ObjectDataSourceを導入する場合(そしてそれにパラメーターを渡すこともできます)、最終的には必要なものを作成する必要があります。

編集:

私のプロジェクトからコードを提供して、私がどのように使用しているかを確認できるようにします。このコードはあなたのニーズに完全ではありませんが、あなたが望むことをする方法をあなたに示します。

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" />

名前空間とタイプ名がどのように連携して私にSelectMethod?選択したパラメーターのオーバーライドは提供していませんが、可能です。あなたはページバッキングコードでそれをするでしょう、そして私はそれについていくらかの洞察を与えることができました、しかし私は完全に過度に複雑にならないように努めています。

メソッドからリストを返す方法に注意してください。そして、私はそのメソッドでそれを定義しているだけですか?そこでデータベース呼び出しを簡単に行うことができます。

于 2012-06-11T15:51:31.477 に答える