Как связать DropDownList в GridView в поле EditItemTemplate? - PullRequest
7 голосов
/ 05 октября 2008

Вот мой код в gridview, который связан во время выполнения:

...
<asp:templatefield>
    <edititemtemplate>
        <asp:dropdownlist runat="server" id="ddgvOpp" />
    </edititemtemplate>
    <itemtemplate>
        <%# Eval("opponent.name") %>
    </itemtemplate>
</asp:templatefield>
...

Я хочу связать выпадающий список "ddgvOpp", но я не знаю как. Я должен, но я не. Вот что у меня есть, но я продолжаю получать ошибку «Ссылка на объект», которая имеет смысл:

protected void gvResults_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow) //skip header row
    {
        DropDownList ddOpp = (DropDownList)e.Row.Cells[5].FindControl("ddgvOpp");
        BindOpponentDD(ddOpp);
    }
}

Где BindOpponentDD() - это то место, где заполняется DropDownList. Я не делаю это в правильном случае? Если нет, куда мне его вставить?

Большое спасибо заранее ...

Ответы [ 5 ]

5 голосов
/ 05 октября 2008

Хорошо, наверное, я просто тупой. Я понял это.

В событии RowDataBound просто добавьте следующее условие:

if (myGridView.EditIndex == e.Row.RowIndex)
{
     //do work
}
2 голосов
/ 02 января 2012

Благодаря Саурабху Трипати,

Решение, которое вы предоставили, сработало для меня. В gridView_RowDataBound () используется событие.

if(gridView.EditIndex == e.Row.RowIndex && e.Row.RowType == DataControlRowType.DataRow)
{
    // FindControl
    // And populate it
}

Если кто-то столкнулся с той же проблемой, попробуйте это.

Приветствие.

1 голос
/ 26 января 2011

У меня была та же проблема, но это исправление (Джейсон, который добавляет условное выражение в обработчик) не работало для меня; строка редактирования никогда не была привязана к данным, поэтому условие никогда не оценивалось как истинное. RowDataBound просто никогда не вызывался с тем же RowIndex, что и GridView.EditIndex. Однако мои настройки немного отличаются: вместо того, чтобы программно связывать выпадающий список, я привязываю его к ObjectDataSource на странице. Тем не менее, раскрывающийся список должен быть привязан отдельно для каждой строки, поскольку его возможные значения зависят от другой информации в строке. Таким образом, ObjectDataSource имеет SessionParameter, и я обязательно устанавливаю соответствующую переменную сеанса, когда это необходимо для привязки.

<asp:ObjectDataSource ID="objInfo" runat="server" SelectMethod="GetData" TypeName="MyTypeName">
<SelectParameters>
    <asp:SessionParameter Name="MyID" SessionField="MID" Type="Int32" />
</SelectParameters>

И выпадающий в соответствующей строке:

<asp:TemplateField HeaderText="My Info" SortExpression="MyInfo">
        <EditItemTemplate>
            <asp:DropDownList ID="ddlEditMyInfo" runat="server" DataSourceID="objInfo" DataTextField="MyInfo" DataValueField="MyInfoID" SelectedValue='<%#Bind("ID") %>' />
        </EditItemTemplate>
        <ItemTemplate>
            <span><%#Eval("MyInfo") %></span>
        </ItemTemplate>
    </asp:TemplateField>

В итоге я не использовал CommandField в GridView для генерации кнопок редактирования, удаления, обновления и отмены; Я сделал это самостоятельно с TemplateField, и, настроив CommandNames соответствующим образом, я смог запустить встроенные действия редактирования / удаления / обновления / отмены в GridView. Для кнопки «Правка» я сделал CommandArgument информацией, необходимой для привязки раскрывающегося списка, вместо PK строки, как это обычно бывает. К счастью, это не помешало GridView редактировать соответствующую строку.

<asp:TemplateField>
        <ItemTemplate>
            <asp:ImageButton ID="ibtnDelete" runat="server" ImageUrl="~/images/delete.gif" AlternateText="Delete" CommandArgument='<%#Eval("UniqueID") %>' CommandName="Delete" />
            <asp:ImageButton ID="ibtnEdit" runat="server" ImageUrl="~/images/edit.gif" AlternateText="Edit" CommandArgument='<%#Eval("MyID") %>' CommandName="Edit" />
        </ItemTemplate>
        <EditItemTemplate>
            <asp:ImageButton ID="ibtnUpdate" runat="server" ImageUrl="~/images/update.gif" AlternateText="Update" CommandArgument='<%#Eval("UniqueID") %>' CommandName="Update" />
            <asp:ImageButton ID="ibtnCancel" runat="server" ImageUrl="~/images/cancel.gif" AlternateText="Cancel" CommandName="Cancel" />
        </EditItemTemplate>
    </asp:TemplateField>

А в обработчике RowCommand:

void grdOverrides_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "Edit")
                Session["MID"] = Int32.Parse(e.CommandArgument.ToString());
        }

RowCommand, конечно же, происходит до того, как строка переходит в режим редактирования и, следовательно, до привязки раскрывающихся данных. Так что все работает. Это немного взломано, но я потратил достаточно времени, пытаясь выяснить, почему строка редактирования уже не привязана к данным.

1 голос
/ 29 июля 2009
protected void grdDevelopment_RowDataBound(object sender, GridViewRowEventArgs e)
{
   if (grdDevelopment.EditIndex == e.Row.RowIndex && e.Row.RowType==DataControlRowType.DataRow) 
   {       
       DropDownList drpBuildServers = (DropDownList)e.Row.Cells[0].FindControl("ddlBuildServers"); 
   }
}

Попробуйте это

Это поможет тебе

0 голосов
/ 04 февраля 2014

Этот код будет делать то, что вы хотите:

<asp:TemplateField HeaderText="garantia" SortExpression="garantia">
 <EditItemTemplate>
   <asp:DropDownList ID="ddgvOpp" runat="server" SelectedValue='<%# Bind("opponent.name") %>'>
       <asp:ListItem Text="Si"  Value="True"></asp:ListItem>
       <asp:ListItem Text="No" Value="False"></asp:ListItem>
   </asp:DropDownList>
 </EditItemTemplate>
 <ItemTemplate>
   <asp:Label ID="Label1" runat="server" Text='<%# Bind("opponent.name") %>'></asp:Label>
 </ItemTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...