У меня есть GridView с автоматически сгенерированной кнопкой «Изменить». Мне нужно было настроенное поведение для столбца «Изображение», поскольку я хотел, чтобы это был выпадающий список элементов, а не простое поле ввода, и я также хотел получить хороший «запасной вариант» в случае, если значение в базе данных на самом деле не было. существует в раскрывающемся списке.
С помощью кода, который я сделал до сих пор, я получил желаемое поведение из поля Image. Проблема в том, что когда я пытаюсь обновить это конкретное поле, я получаю сообщение об ошибке, которое не может найти метод для обновления формы:
ObjectDataSource 'objDataSource' could not find a non-generic method 'UpdateDiscovery' that has parameters: ModuleId, Visible, Position, Title, Link, ItemId.
Это не хорошо, потому что у меня действительно есть метод UpdateDiscovery. Однако между заголовком и связью должен быть другой параметр, принадлежащий полю изображения, и он не передается. Я понимаю, что, вероятно, кнопка обновления не знает, чтобы пропустить это поле, поскольку это TemplateField, а не BoundField, и когда я использую Bind('image')
в качестве выбранного значения для раскрывающегося списка, кажется, что он обновляется нормально ... .но только до тех пор, пока поле в базе данных, когда я пытаюсь отредактировать строку, действительно существует, в противном случае оно разорвется и выдаст ошибку об отсутствии значения в раскрывающемся списке.
У меня определено следующее GridView:
<asp:GridView ID="grdDiscoverys" runat="server" DataSourceID="objDataSource" EnableModelValidation="True" AutoGenerateColumns="false" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" DataKeyNames="ItemId" OnRowDataBound="cmdDiscovery_RowDataBound">
<Columns>
<asp:BoundField DataField="ItemId" HeaderText="#" ReadOnly="true" />
<asp:BoundField DataField="Visible" HeaderText="Visible" />
<asp:BoundField DataField="Position" HeaderText="Position" />
<asp:TemplateField HeaderText="Image">
<ItemTemplate>
<asp:Label ID="lblViewImage" runat="server" />
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="ddlEditImage" runat="server" title="Image" DataValueField="Key" DataTextField="Value" />
</EditItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Title" HeaderText="Title" />
<asp:BoundField DataField="Link" HeaderText="Link" />
</Columns>
</asp:GridView>
Источник данных, с которым это связано:
<asp:ObjectDataSource ID="objDataSource" runat="server" TypeName="MyCompany.Modules.Discovery.DiscoveryController" SelectMethod="GetDiscoverys" UpdateMethod="UpdateDiscovery" DeleteMethod="DeleteDiscovery">
<SelectParameters>
<asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
</SelectParameters>
<UpdateParameters>
<asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
</UpdateParameters>
<DeleteParameters>
<asp:QueryStringParameter Name="ModuleId" QueryStringField="mid" />
</DeleteParameters>
</asp:ObjectDataSource>
Метод cmdDiscovery_RowDataBound, вызываемый при привязке данных строки, представляет собой следующий код C #:
protected void cmdDiscovery_RowDataBound(object sender, GridViewRowEventArgs e)
{
try
{
if (e.Row.RowIndex >= 0)
{
int intImage = ((DiscoveryInfo)e.Row.DataItem).Image;
if (grdDiscoverys.EditIndex == -1)
{
// View
Label lblViewImage = ((Label)e.Row.FindControl("lblViewImage"));
if (GetFileDictionary().ContainsKey(intImage))
{
lblViewImage.Text = GetFileDictionary()[intImage];
}
else
{
lblViewImage.Text = "Missing Image";
}
} else {
// Edit
DropDownList ddlEditImage = ((DropDownList)e.Row.FindControl("ddlEditImage"));
ddlEditImage.DataSource = GetFileDictionary();
ddlEditImage.DataBind();
if (GetFileDictionary().ContainsKey(intImage))
{
ddlEditImage.SelectedValue = intImage.ToString();
}
}
}
}
catch (Exception exc)
{
//Module failed to load
Exceptions.ProcessModuleLoadException(this, exc);
}
}
Как мне убедиться, что значение Image в раскрывающемся списке передается в функцию обновления?