0

グリッド ビュー内で使用しているステータス ドロップダウン リストがあります。ユーザーは、グリッド ビュー内の行を編集するときに必要なリスト項目を選択できます。問題は、現在の実装が選択された値を取得しておらず、デフォルト/ロードされた値のみを取得していることです。

これは、グリッド ビューの定義です。

    <asp:GridView ID="applicationGrid" runat="server"  Width="95%"
        AutoGenerateEditButton="True" 
        AutoGenerateColumns="False" 
        ShowFooter="True"
        CellSpacing="10" 
        HeaderStyle-HorizontalAlign="Left" 
        ItemStyle-HorizontalAlign="Left"
        OnRowUpdating="applicationGrid_RowUpdating" 
        OnRowEditing="applicationGrid_RowEditing" 
        OnRowCancelingEdit="applicationGrid_RowCancelingEdit"
        AutoPostBack="true" >

これは、編集時にドロップダウン リストが表示される列の定義です。

                <asp:TemplateField HeaderText="Status">
                <ItemTemplate>   
                    <asp:Label ID="StatusDescription" runat="server" Text='<%# Eval("STATUS_DESCRIPTION") %>'></asp:Label>
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="StatusDescriptionList" runat="server" DataTextField="status_description"
                            DataValueField="application_status_code" OnLoad="DropDownLoadEdit">
                       <asp:ListItem Text="Status:" Value="default"></asp:ListItem>
                    </asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>

これは、更新シナリオを処理している背後にあるコードです。

    protected void applicationGrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        GridViewRow row = applicationGrid.Rows[e.RowIndex];
        applicationGrid.EditIndex = -1;

        Label applicationCodeLabel = row.FindControl("AppID") as Label;
        TextBox applicationNameTextBox = row.FindControl("AppNameEdit") as TextBox;
        TextBox applicationURLTextBox = row.FindControl("AppURLEdit") as TextBox;
        DropDownList applicationStatusDropDownList = row.FindControl("StatusDescriptionList") as DropDownList;

        int applicationCode = Convert.ToInt32(applicationCodeLabel.Text);
        string applicationName = applicationNameTextBox.Text;
        string applicationURL = applicationURLTextBox.Text;
        int applicationStatus = Convert.ToInt32(applicationStatusDropDownList.SelectedValue.ToString());
        //string applicationStatus2 = applicationStatusDropDownList.SelectedItem.Value;
        //string applicationStatus3 = applicationStatusDropDownList.SelectedItem.Text;

        application.UpdateApplication(applicationCode, applicationName, applicationURL);
        PopulateApplications();
    }

すべてが機能していますが、選択された値はロードされたものではなく、ユーザーが選択したものでもありません。したがって、問題はリストから選択した値を取得することです。何を変更する必要があり、その理由は何ですか?

        protected void applicationGrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        GridViewRow row = applicationGrid.Rows[e.RowIndex];
        applicationGrid.EditIndex = -1;

        Label applicationCodeLabel = row.FindControl("AppID") as Label;
        TextBox applicationNameTextBox = row.FindControl("AppNameEdit") as TextBox;
        TextBox applicationURLTextBox = row.FindControl("AppURLEdit") as TextBox;
        DropDownList applicationStatusDropDownList = row.FindControl("StatusDescriptionList") as DropDownList;

        int applicationCode = Convert.ToInt32(applicationCodeLabel.Text);
        string applicationName = applicationNameTextBox.Text;
        string applicationURL = applicationURLTextBox.Text;
        int applicationStatus = Convert.ToInt32(applicationStatusDropDownList.SelectedValue.ToString());
        //string applicationStatus2 = applicationStatusDropDownList.SelectedItem.Value;
        //string applicationStatus3 = applicationStatusDropDownList.SelectedItem.Text;

        application.UpdateApplication(applicationCode, applicationName, applicationURL);
        PopulateApplications();
    }

編集: Populate メソッドの追加:

        protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            try
            {
                PopulateApplications();
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }
    }

    private void PopulateApplications()
    {
        DataTable reader = application.GetApplicationList();
        applicationGrid.DataSource = reader;
        applicationGrid.DataBind();
        applicationGrid.AllowSorting = true;
    }

    protected void DropDownLoadEdit(object sender, EventArgs e)
    {        
            DataTable statusTable = application.GetStatusList();

            DropDownList dropdown = sender as DropDownList;
            dropdown.DataSource = statusTable;
            dropdown.DataTextField = "status_description";
            dropdown.DataValueField = "application_status_code";
            dropdown.DataBind()
    }

更新 #2: 選択したインデックス用のクラスに静的変数を入力しようとしています。これは、更新が押されたときに使用されます。ただし、これはまだドロップダウンリストの元の値を取得しており、選択したものではありません。

これは方法です:

    protected void StatusDescriptionList_SelectedIndexChanged(object sender, System.EventArgs e)
    {
        DropDownList ddl = (DropDownList)sender;
        selectedValue = Convert.ToInt32(ddl.SelectedValue.ToString());
    }
4

4 に答える 4

0

@ライアン、これをやったことがありますか ' AutopostBack="True"

<asp:DropDownList ID="StatusDescriptionList" runat="server" AutopostBack="True" DataTextField="status_description"
                            DataValueField="application_status_code" OnLoad="DropDownLoadEdit">
                       <asp:ListItem Text="Status:" Value="default"></asp:ListItem>
                    </asp:DropDownList>
于 2013-01-12T06:12:55.287 に答える
0

問題は、ポストバックにある可能性があります。

アイテムがドロップダウンから選択されると、ページは、選択した値をポストバックして消滅させます。

この問題を克服するために。ページ内のドロップダウン リストをポスト バックにバインドするか、Ajax 更新パネルを利用します。

于 2012-06-25T11:07:39.383 に答える
0
<asp:DropDownList ID="StatusDescriptionList" runat="server" DataTextField="status_description"
                        DataValueField="application_status_code" SelectedValue="application_status_code" AutopostBack="True" OnLoad="DropDownLoadEdit">
                   <asp:ListItem Text="Status:" Value="default"></asp:ListItem>
                </asp:DropDownList>
于 2013-12-22T06:37:36.553 に答える
0

DropDownLoadEditトランジションがポストバックであるかどうかに関係なく、 のリストを再作成していますか? その場合、値が読み取られる前にリストが再設定され、メソッドが値を読み取る前にデフォルトに設定されます。

于 2012-06-25T10:57:49.930 に答える