Выпадающие списки в GridView не учитывают выбор - PullRequest
1 голос
/ 10 декабря 2011

На странице ASP.NET у меня есть сетка, которая содержит раскрывающийся список в одном из столбцов. В то время как другие столбцы в представлении таблицы привязаны к данным, раскрывающийся список НЕТ и содержит только 3 предустановленных значения: «Франк», «Да» и «Нет». («Фрэнк» используется в качестве примера, так что я не получаю ложные показания из моего предпочтительного пустого параметра)

<asp:GridView ID="testGrid" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="Code1" HeaderText="Code1" />
        <asp:BoundField DataField="Code2" HeaderText="Code2" />
        <asp:TemplateField HeaderText="Like Frank?">
            <ItemTemplate>
                <asp:DropDownList runat="server" ID="ddlLikeFrank">
                    <asp:ListItem>Frank</asp:ListItem>
                    <asp:ListItem>Yes</asp:ListItem>
                    <asp:ListItem>No</asp:ListItem>
                </asp:DropDownList>
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>
        <asp:HyperLinkField ... HeaderText="File" />
    </Columns>
</asp:GridView>
<br />
<asp:Button ID="cmdUpdate" runat="server" Text="Update" OnClick="cmdUpdate_Click" /></div>

Мне не нужен AutoPostBack для этих выпадающих списков, поскольку я хочу учитывать их выбранные значения только при нажатии кнопки cmdUpdate.

protected void cmdUpdate_Click(object sender, EventArgs e)
{
    bool likesFrank = false;

    string selected = "";
    DropDownList ddl = null;
    GridViewRow current = null;
    // Go through each row and check the dropdown list.
    for (int i = 0; i < testGrid.Rows.Count; i++)
    {
        current = testGrid.Rows[i];
        ...
        ddl = (DropDownList)(current.FindControl("ddlLikeFrank"));

        /* THIS FOR LOOP IS WAS USED FOR INVESTIGATING THIS ISSUE*/
        for (int j = 0; j < ddl.Items.Count; j++)
        {
            if (ddl.Items[j].Selected)
            {
                continue;
            }
        }           

        selected = ddl.SelectedItem.Value;
        switch (selected)
        {
            case LIKE: // "Yes"
                likesFrank = true;
                break;
            case DONT_LIKE: // "No"
                likesFrank = false;
                break;
            default: // If nothing is selected in the drop-down list, move on.
                continue;
        } // end switch block

        /* USE THE DERIVED BOOLS HERE */
   } // end for loop on grid rows
} // end method cmdUpdateClick

Проблема в следующем: Независимо от того, какой элемент выбран в любом из выпадающих списков, моя страница считает, что для каждого из них установлено значение "Франк", то есть первый элемент. Более того, если я поставлю точку останова в верхней части цикла for, обозначенного как «Код расследования», а затем взаимодействую со страницей следующим образом:

  1. Выберите различные параметры выпадающего списка для разных строк.
  2. Нажмите кнопку Обновить.

... мой код отладки говорит мне, что ни один из пунктов не выбран! Ни один из них !! Я могу посмотреть на 2 Да и 3 Нет на странице, и мои инструменты отладки в VS2008 говорят мне, что в каждом раскрывающемся списке ничего не выбрано .

Как это возможно? (ПРИМЕЧАНИЕ: я пробовал это с EnableViewState, установленным в true, и с EnableViewState, даже не упомянутым в заголовке страницы.)

Спасибо.

Ответы [ 3 ]

0 голосов
/ 10 декабря 2011

На стороне сервера

protected void btnSaveRankChanges_Click(object sender, EventArgs e)
        {
            foreach (GridViewRow grv in GridViewRankChanges.Rows)
            {
DropDownList dropDownChangeRank = (DropDownList)grv.FindControl("DropDownListRank");
   StudentInfoObject.RankID = Convert.ToInt32(dropDownChangeRank.SelectedValue);
}
}

в сетке

<asp:TemplateField HeaderText="Select New Rank">
                                <ItemTemplate>
                                    <asp:DropDownList ID="DropDownListRank" runat="server">
                                    </asp:DropDownList>
                                </ItemTemplate>
                            </asp:TemplateField>

При нажатии кнопки

 <asp:Button ID="btnSaveRankChanges" runat="server" Text="Submit" ValidationGroup="RankChanges"
                        class="accordionHeader" Height="27px" OnClick="btnSaveRankChanges_Click" OnClientClick="LoadImage()" />

Раскрывающийся список связывается таким образом

/// <summary>
        /// bind dropdown with rank in grid
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridViewRankChanges_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            DropDownList drdList;
            // Nested DropDownList Control reference is passed to the DrdList object. This will allow you access the properties of dropdownlist placed inside the GridView Template column.
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //bind dropdown rank
                drdList = (DropDownList)e.Row.FindControl("DropDownListRank");
                drdList.DataSource = RankList.GetRankList(false);
                drdList.DataTextField = "Rank";
                drdList.DataValueField = "RankID";
                drdList.DataBind();
                drdList.Items.Insert(0, new ListItem("Select", "0"));

            }
        }

Это работает для меня, надеюсь, это поможет и вам.

0 голосов
/ 04 января 2012

Я думаю, вы перепривязываете сетку к каждому посту обратно, что перезагрузит все данные вместе с выпадающими спискамиНапримерПожалуйста, проверьте, если (! Page.IsPostBack), прежде чем делать указание данных gridview.Пожалуйста, дайте мне знать, если это не проблема.

0 голосов
/ 10 декабря 2011

принять удар с этим.Замените индекс на основе этого

foreach(GridViewRow row in grid.Rows)
{
   var ddlVal = ((DropDownList)row.FindControl("yourId")).SelectedItem.Value;
}

<< use SelectedItem.Value - I think this will solve your problem >>

Обновление:

Чтобы обновить выбранный индекс ddl, вам нужно сделатьпостбэк.Включить autopostback = true.Но здесь вы упомянули, что вам не нужен автоответчик, так как это единственный обходной путь, поэтому поместите вид сетки в панель обновления, чтобы подавить обратную передачу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...