我有一个带有自动生成的编辑按钮的GridView。我想要一些Image列的自定义行为,因为我希望它是一个项目的下拉列表而不是一个简单的输入字段,我还想要一些很好的“后备”,以防数据库中的值实际上没有存在于下拉列表中。
使用我到目前为止所做的代码,我已经从Image字段获得了我想要的行为。问题是,当我尝试更新该特定字段时,我收到一个错误,向我吐出一个无法找到更新表单的方法:
ObjectDataSource 'objDataSource' could not find a non-generic method 'UpdateDiscovery' that has parameters: ModuleId, Visible, Position, Title, Link, ItemId.
这不好,因为我有一个UpdateDiscovery方法。但是,在Title和Link之间,应该有另一个属于Image字段的param,并且它没有被传递。我意识到可能更新按钮不知道传递该字段,因为它是一个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值传递给更新函数?
答案 0 :(得分:0)
您可以使用objDataSource_Updating
分配ddlEditImage.SelectedValue