C# DotNetNuke Module: GridVIew AutoGenerateEditButton is skipping over a field on update.
- by AlexMax
I have a GridView with an automatically generated Edit button. I wanted some customized behavior for the Image column, since I wanted it to be a drop down list of items as opposed to a simple input field, and I also wanted some nice "fallback" in case the value in the database didn't actually exist in the drop down list.
With the code I have done so far, I have gotten the behavior I desire out of the Image field. The problem is that when i attempt to update that particular field, I get an error spit out back at me that it can't find a method to update the form with:
ObjectDataSource 'objDataSource' could not find a non-generic method 'UpdateDiscovery' that has parameters: ModuleId, Visible, Position, Title, Link, ItemId.
That's not good, because I DO have an UpdateDiscovery method. However, between Title and Link, there is supposed to be another param that belongs to the Image field, and it's not being passed. I realize that it's probably the update button doesn't know to pass that field, since it's a TemplateField and not a BoundField, and when I use Bind('image') as the selected value for the drop down list, it seems to update fine...but only as long as the field in the database when I try and edit the row actually exists, otherwise it bombs out and gives me an error about the value not existing in the drop down list.
I have the following GridView defined:
<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>
The datasource that this is tied to:
<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>
The cmdDiscovery_RowDataBound method that gets called when the row's data is bound is the following C# code:
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);
}
}
How do I make sure that the Image value in the drop down list is passed to the update function?