1

TextBox と RequiredFieldValidator を、GridView にネストされた DetailsView の InsertItemTemplate に追加しようとしています。InsertItemTemplate に PlaceHolder を追加し、GridView の OnRowDataBound イベントで次のことを行っています。

編集: ValidationGroup を Insert LinkBut​​ton (lnkInsert) に追加する必要があることに気付きましたが、これは TextBox や RequiredFieldValidator のレンダリングには影響しません。ValidationGroup プロパティも lnkInsert に追加されません。親GridViewのRowDataBoundイベントで、DetailsView内のコントロールを編集できないようです。

if (e.Row.RowType == DataControlRowType.DataRow)
{
    string valGroup = "PickListValidationGroup" + e.Row.RowIndex;

    // Add the validation summary
    PlaceHolder vsPlaceHolder = (PlaceHolder)e.Row.FindControl("ValidationSummaryPlaceHolder");
    ValidationSummary vs = new ValidationSummary();
    vs.ID = "PickListValidationSummary" + e.Row.RowIndex;
    vs.ValidationGroup = valGroup;
    vs.CssClass = "failurenotification";
    vsPlaceHolder.Controls.Add(vs);

    // Add the TextBox and RequiredFieldValidator
    DetailsView dv = (DetailsView)e.Row.FindControl("AddPickListOption");
    PlaceHolder displayPlaceHolder = (PlaceHolder)dv.FindControl("DisplayTextPlaceHolder");
    TextBox tb = new TextBox();
    tb.ID = "txtDisplayText" + e.Row.RowIndex;
    tb.Text = "<%# Bind(\"DisplayText\") %>";
    RequiredFieldValidator rfv = new RequiredFieldValidator();
    rfv.ID = "DisplayTextRequired" + e.Row.RowIndex;
    rfv.ControlToValidate = tb.ID;
    rfv.ErrorMessage = "Enter text to display for the list option.";
    rfv.ValidationGroup = valGroup;
    rfv.ToolTip = "Enter text for the option";
    rfv.Text = "*";
    displayPlaceHolder.Controls.Add(tb);
    displayPlaceHolder.Controls.Add(rfv);

    // Add the ValidationGroup to the Insert LinkButton
    LinkButton lnk = (LinkButton)dv.FindControl("lnkInsert");
    lnk.ValidationGroup = valGroup;
}

ValidationSummary はプレースホルダーに追加されますが (DetailsView にはありません)、TextBox と RequiredFieldValidator が DetailsView InsertItemTemplate の PlaceHolder に表示されません。

編集: ここでも、GridView にネストされている DetailsView マークアップを次に示します。

<div class="error_div">
    <asp:PlaceHolder ID="ValidationSummaryPlaceHolder" runat="server"></asp:PlaceHolder>
</div>
<asp:DetailsView ID="AddPickListOption" runat="server" Height="50px" 
    Width="125px" AutoGenerateRows="False" DataSourceID="PickListDataSource" 
    DefaultMode="Insert" EnableModelValidation="True" OnItemInserted="AddPickListOption_ItemInserted"
    OnItemInserting="AddPickListOption_ItemInserting" Visible="False" 
    OnItemCommand="AddPickListOption_ItemCommand">
    <Fields>
        <asp:TemplateField HeaderText="Display Text:" SortExpression="DisplayText">
            <InsertItemTemplate>
                <asp:PlaceHolder ID="DisplayTextPlaceHolder" runat="server"></asp:PlaceHolder>
            </InsertItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Sort Order:" SortExpression="SortOrder">
            <InsertItemTemplate>
                <asp:TextBox ID="txtPickListSortOrder" runat="server" Text='<%# Bind("SortOrder") %>'></asp:TextBox>
            </InsertItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Price Change:" SortExpression="PriceChange">
            <InsertItemTemplate>
                <asp:TextBox ID="txtPickListPriceChange" runat="server" Text='<%#Bind("PriceChange") %>'></asp:TextBox>
            </InsertItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
            <InsertItemTemplate>
                <asp:LinkButton ID="lnkInsert" runat="server" CausesValidation="True" 
                    CommandName="Insert" Text="Insert"></asp:LinkButton>&nbsp;
                <asp:LinkButton ID="lnkCancel" runat="server" CausesValidation="False" 
                    CommandName="Cancel" Text="Cancel"></asp:LinkButton>
            </InsertItemTemplate>
        </asp:TemplateField>
    </Fields>
</asp:DetailsView>

ここで何が欠けていますか?これは、まだしっかりと理解していないページ/コントロールのライフサイクルの問題であるに違いないと考えています。

4

1 に答える 1