Вот мой код в сетке, привязанной во время выполнения:
...
<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. Я делаю это не в нужное время? Если нет, то что мне нужно вставить?
Большое спасибо заранее...





Хорошо, я думаю, я просто тупой. Я понял.
В событии RowDataBound просто добавьте следующее условие:
if (myGridView.EditIndex == e.Row.RowIndex)
{
//do work
}
нет, вы делаете, потому что он начинается с / строки заголовка и движется вниз. вы получите сообщение об ошибке, если вы этого не сделаете, или он просто не работает.
Или вы можете проверить, находится ли строка в режиме редактирования с помощью этого if (e.RowState && DataControlRowState.Edit) > 0 {}
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");
}
}
Попробуй это
Это поможет тебе
У меня была та же проблема, но это исправление (исправление Джейсона, которое добавляет условие в обработчик) не сработало для меня; строка Edit никогда не была привязана к данным, поэтому это условие никогда не оценивалось как истинное. 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, конечно же, выполняется до того, как строка перейдет в режим редактирования и, следовательно, до привязки данных раскрывающегося списка. Так что все работает. Это немного похоже на взлом, но я потратил достаточно времени, пытаясь понять, почему строка редактирования еще не была привязана к базе данных.
Благодаря Саурабу Трипати,
Предложенное вами решение сработало для меня. В gridView_RowDataBound () используется событие.
if (gridView.EditIndex == e.Row.RowIndex && e.Row.RowType == DataControlRowType.DataRow)
{
// FindControl
// And populate it
}
Если кто-то застрял с той же проблемой, попробуйте это.
Ваше здоровье.
Этот код будет делать то, что вы хотите:
<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>
Я думаю, вам также не понадобится (e.Row.RowType == DataControlRowType.DataRow), если вы каким-то образом не взломали редактируемые строки заголовка.