Модуль Cot DotNetNuke: GridVIew AutoGenerateEditButton пропускает поле при обновлении - PullRequest
0 голосов
/ 31 января 2011

У меня есть 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 в раскрывающемся списке передается в функцию обновления?

1 Ответ

0 голосов
/ 18 марта 2011

Вы можете использовать objDataSource_Updating для получения ddlEditImage.SelectedValue

...