簡體   English   中英

Eval / Bind的數據綁定問題-C#Webforms asp.net

[英]Databinding issue with Eval/Bind - C# Webforms asp.net

我正在處理一個現有項目,正在進行一些更新,並且在“ FenDropDownListRoles”控件中設置“ FenSelectedValue”的值時遇到麻煩。

我不斷收到錯誤:

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control in repeater control

但是Label控件中的eval可以正常工作。 我一直在這里和那里閱讀,我讀到有關它沒有在正確的時間綁定的信息,因此我將控件從“ EditItemTemplate”(該控件最終應移至“ ItemTemplate”)進行了測試,但還是沒有運氣。 。

                <ItemTemplate>
                    <asp:Label ID="lblRolOmschrijving" Text='<%# Eval("Rol_omschrijving") %>' runat="server" />
                    <fen:FenDropDownListRoles ID="ddlRoles" FenSelectedValue='<%# Eval("Rol_omschrijving") %>' runat="server" Watermark="AdministratorType" Required="true" ValidationGroup="grpAddUser" />
                </ItemTemplate>

這是我學會在網格視圖中設置下拉菜單項的方法。

示例網格:

        <div id="gridContainerFormulations">
        <script type="text/javascript">
            $(document).ready(function () {
                //This is done here, instead of codebehind, because the SelectedValue property of the drop down list 
                //simply does not work when databinding. I set the two 'hid' values via the RowEditing event
                $("[id$='drpLotNumber']").val($("#hidSelectedFormulationLotNo").val());
            });
        </script>
        <asp:hiddenfield runat="server" id="hidSelectedFormulationLotNo" value="-1" />
        <asp:gridview id="dgrStudyFormulations" cssclass="data" runat="server" allowpaging="False" autogeneratecolumns="False"
            datakeynames="Id, FormulationLotNo, FormulationNo">
                <Columns>
                    <asp:BoundField HeaderText="Formulation" ReadOnly="True" DataField="FormulationName" />
                    <asp:TemplateField HeaderText="Lot #">
                        <EditItemTemplate>
                            <asp:dropdownlist ID="drpLotNumber" AddBlank="False" runat="server" />
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="lblLotNumber" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "FormulationLot.Name")%>' />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField HeaderText="AI in Formulation" ReadOnly="True" DataField="ActiveIngredientName" />
                    <asp:TemplateField HeaderText="AI Of Interest">
                        <EditItemTemplate>
                            <asp:CheckBox ID="chkOfInterest" Checked='<%# DataBinder.Eval(Container.DataItem, "OfInterest")%>' runat="server" />
                        </EditItemTemplate>
                        <ItemTemplate>
                            <%--<asp:Label ID="lblOfInterest" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "OfInterest")%>' />--%>
                            <asp:image runat="server" id="imgOfInterest" Visible="False" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField HeaderText="AI Amount" ReadOnly="True" DataField="AIAmountText" />
                    <asp:CommandField ShowEditButton="True" ShowCancelButton="True" ShowDeleteButton="True"/>
                </Columns>
        </asp:gridview>

然后在grid的row_editing事件中:

SelectedFormulationLotNo = CType(dgrStudyFormulations.DataKeys(e.NewEditIndex)("FormulationLotNo"), String)

在HTML中設置隱藏字段

 Property SelectedFormulationLotNo() As String
    Get
        Return hidSelectedFormulationLotNo.Value.Trim()
    End Get
    Set(value As String)
        If String.IsNullOrEmpty(value) Then
            hidSelectedFormulationLotNo.Value = String.Empty
        Else
            hidSelectedFormulationLotNo.Value = value.Trim()
        End If
    End Set
End Property

然后jQuery函數調用在網格中新可編輯的行中設置正確的選項。

我最終是如何做到的(但是將答案留在Rake36的答案上,因為它可能也可以工作,並且使我朝着需要的方向前進)因為我由於某種原因無法使Javascript工作,並且從搞亂中我知道我可以在“ RowDataBound”中獲取標簽的值,我將Rake36的方法與隱藏字段結合在一起,並在代碼隱藏區(在RowDataBound中)中設置了值

在后面的代碼中:

    protected void gvwUsers_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        DropDownList DropDownListRol = (DropDownList)e.Row.FindControl("ddlRolOmschrijving");
        if (e.Row.RowType == DataControlRowType.DataRow && DropDownListRol != null)
        {
            DsFenVlaanderen.tb_rolDataTable dtRole = DsFenVlaanderen.RolTableAdapter.GetData();
            //Fill Dropdownlist
            DropDownListRol.DataSource = dtRole;
            DropDownListRol.DataValueField = dtRole.Rol_IDColumn.ColumnName;
            DropDownListRol.DataTextField = dtRole.Rol_omschrijvingColumn.ColumnName;
            DropDownListRol.DataBind();
            //Set Selected value
            DropDownListRol.Items.FindByValue(hidSelectedRole.Value).Selected = true;
        }
    }

    protected void gvwUsers_RowEditing(object sender, GridViewEditEventArgs e)
    {
        //Set hiddenfield to value of Rol_ID
        hidSelectedRole.Value = gvwUsers.DataKeys[e.NewEditIndex].Values["Rol_ID"].ToString();

    }

這是我的網格:

    <asp:hiddenfield runat="server" id="hidSelectedRole" value="-1" />
    <fen:FenGridViewSelectable ID="gvwUsers" runat="server" Selectable="False"
        DataSourceID="dsUsers" EnableModelValidation="True" SkinID="Blue"
        AllowSorting="True" OnDataBound="gvwUsers_DataBound" OnRowDeleting="gvwUsers_RowDeleting"
        AutoGenerateColumns="False" DataKeyNames="User_ID,Rol_ID" OnRowDataBound="gvwUsers_RowDataBound" OnRowEditing="gvwUsers_RowEditing" OnRowUpdating="gvwUsers_RowUpdating">
        <Columns>
            <asp:BoundField DataField="User_ID" HeaderText="Gebruikersnaam" ReadOnly="True" SortExpression="User_ID" />
            <asp:BoundField DataField="User_ID_EXT" HeaderText="Naam" ReadOnly="true" SortExpression="User_ID_EXT" />
            <%-- <asp:BoundField DataField="Rol_omschrijving" HeaderText="Type bestuurder" SortExpression="Rol_omschrijving" /> --%>
            <asp:TemplateField HeaderText="Type bestuurder" SortExpression="Rol_omschrijving">
                <ItemTemplate>
                    <asp:Label ID="lblRolOmschrijving" Text='<%# Eval("Rol_omschrijving") %>' runat="server"/>
                </ItemTemplate>
                <EditItemTemplate> 
                    <asp:DropDownList ID="ddlRolOmschrijving" runat="server" DataField="Rol_omschrijving"></asp:DropDownList>
                </EditItemTemplate>
            </asp:TemplateField>
            <fen:FenTemplateField HeaderStyle-Width="100px">
                <ItemTemplate>
                    <fen:FenButton ID="btnEdit" runat="server" Function="Edit" />
                    <fen:FenButton ID="btnDelete" runat="server" Function="Delete" />
                </ItemTemplate>
                <EditItemTemplate>
                    <fen:FenButton ID="btnUpdate" runat="server" Function="Update" />
                    <fen:FenButton ID="btnCancel" runat="server" Function="CancelInline" />
                </EditItemTemplate>
            </fen:FenTemplateField>
        </Columns>
    </fen:FenGridViewSelectable>
    <asp:ObjectDataSource ID="dsUsers" runat="server"
        OldValuesParameterFormatString="original_{0}" SelectMethod="GetData"
        TypeName="FenVlaanderen.DsFenVlaanderenTableAdapters.vUsersTableAdapter"></asp:ObjectDataSource>

    <asp:Label ID="lblNoResults" runat="server" Visible="false" CssClass="error">Er werden geen gebruikers gevonden.</asp:Label>
    <asp:Label ID="lblDeleteNotAllowed" runat="server" Visible="false" CssClass="error" />

    <fen:AddUser ID="addUser" runat="server" OnFenControlSaved="addUser_FenControlSaved" />
</ContentTemplate>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM