Обновить содержимое DropDownList, выбирая данные из того же источника данных - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь обновить содержимое одного DropDownList на основе значения 3 других DropDownLists. У меня есть 2 таблицы, одна из которых содержит Projects, а другая содержит SubProjects. Эти 2 имеют 3 соответствующих свойства:

  • Год
  • CountryID
  • OEID

Я хочу присвоить SubProjects для Projects используя эти критерии соответствия. Таким образом, мой SubProject Adapter имеет метод, который смачивает представление, содержащее эти данные. В представлении я пытаюсь использовать следующий код:

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:DetailsView ID="DetailsViewProject" runat="server" AutoGenerateRows="False" DataKeyNames="Guid" DataSourceID="ObjectDataSourceProject" DefaultMode="Insert" Height="50px" Width="125px" OnItemInserted="DetailsViewProject_ItemInserted">

        <Fields>                
            <asp:TemplateField HeaderText="Name">
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBoxName" Width="245px" runat="server" Text='<%# Bind("Name") %>' MaxLength="100" ></asp:TextBox>
                    <asp:RequiredFieldValidator ID="RequiredFieldValidatorName" ControlToValidate="TextBoxName" runat="server" ErrorMessage="Please specifiy a Name">*</asp:RequiredFieldValidator>
                    <cc1:ValidatorCalloutExtender ID="ValidatorCalloutExtenderName" runat="server" TargetControlID="RequiredFieldValidatorName" />
                </InsertItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Country">
                <InsertItemTemplate>
                    <asp:DropDownList ID="lstCountries" Width="250px" runat="server" DataSourceID="ObjectDataSourceCountries" DataTextField="Name" DataValueField="ID" SelectedValue='<%#Bind("CountryID") %>' AutoPostBack="True"></asp:DropDownList>
                </InsertItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Organisation Unit">
                <InsertItemTemplate>
                    <asp:DropDownList ID="lstOEs" Width="250px" runat="server" DataSourceID="ObjectDataSourceOEs" DataTextField="Name" DataValueField="ID" SelectedValue='<%#Bind("OrganisationUnitID") %>' OnDataBinding="lstOEs_DataBound" AutoPostBack="True"></asp:DropDownList>
                </InsertItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Year">
                <InsertItemTemplate>
                    <asp:DropDownList ID="lstProjectYears" Width="250px" runat="server" DataSourceID="SqlDataSourceProjectYears" DataTextField="ProjectYear" DataValueField="ProjectYear" SelectedValue='<%#Bind("ProjectYear") %>' OnDataBinding="lstProjectYears_DataBound" AutoPostBack="True"></asp:DropDownList>
                </InsertItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Project">
                <InsertItemTemplate>
                    <asp:DropDownList ID="lstProjectOverall" Width="250px" runat="server" DataTextField="ProjectName" DataSourceID="ObjectDataSourcePOs" DataValueField="ID" SelectedValue='<%#Bind("ProjectOverallID")%>'></asp:DropDownList>
                </InsertItemTemplate>
            </asp:TemplateField>
           <asp:CommandField ButtonType="Button" ShowCancelButton="False" ShowInsertButton="True" InsertText="Insert" />
        </Fields>
    </asp:DetailsView>

    <asp:ValidationSummary ID="ValidationSummary1" runat="server" />


    <asp:ObjectDataSource ID="ObjectDataSourceProject" runat="server" ...and so on
    </asp:ObjectDataSource>

    <asp:ObjectDataSource ID="ObjectDataSourceOEs" runat="server" ...and so on 
</asp:ObjectDataSource>

    <-- here -->
    <asp:ObjectDataSource ID="ObjectDataSourcePOs" runat="server" 
        SelectMethod="GetProjectsOverallByParameters" TypeName="Projects">
        <SelectParameters>
            <asp:ControlParameter ControlID="DetailsViewProject$lstProjectYears" name="ProjectYear" PropertyName="SelectedValue"/>
            <asp:ControlParameter ControlID="DetailsViewProject$lstOEs" name="OrganisationUnitID" PropertyName="SelectedValue"/>
            <asp:ControlParameter ControlID="DetailsViewProject$lstCountries" name="CountryID" PropertyName="SelectedValue"/>
        </SelectParameters>
    </asp:ObjectDataSource>

    <asp:ObjectDataSource ID="ObjectDataSourceCountries" runat="server" OldValuesParameterFormatString="{0}" SelectMethod="GetCountries" TypeName="Countries"></asp:ObjectDataSource>   

    <asp:SqlDataSource ID="SqlDataSourceProjectYears" runat="server" ...and so on
    </asp:SqlDataSource>
</asp:Content>

Но я получаю эту ошибку:

System.InvalidOperationException: 'Методы привязки данных, такие как Eval (), XPath() и Bind () можно использовать только в контексте элемента управления, связанного с данными. '

Почему я получаю эту ошибку и как ее решить? Как я могу получить данные с адаптера, используя либо код, либо механизм обновления aspnet?

Ответы [ 2 ]

1 голос
/ 10 октября 2019

вы должны использовать свойство AppendDataBoundItems = "True | False" , когда вам нужно поместить существующий элемент как есть.

0 голосов
/ 11 октября 2019

Я решил проблему:
Проблема заключалась в том, что схема Project и схема ProjectOverall не совпадали.
Я изменил адаптер и добавил метод доступа для ProjectOverall.

SELECT ID, CountryID, OrganisationUnitID, ProjectYear, ProjectName
FROM wc_ProjectsOverall 
WHERE (CountryID = @CountryID) AND (OrganisationUnitID = @OrganisationUnitID) AND (ProjectYear = @ProjectYear)

В ProjectOverall.cs:

[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
public WebControlling.ProjectsOverallDataTable GetProjectsOverallByAttributes(Guid CountryID, Guid OrganisationUnitID, Int32 ProjectYear)
{
    if (CountryID == null || OrganisationUnitID == null || ProjectYear == 0)
        return new WebControlling.ProjectsOverallDataTable();
    return Adapter.GetProjectsByAttribute(CountryID, OrganisationUnitID, ProjectYear);
}

В представлении ProjectAdd.aspx:

<asp:TemplateField HeaderText="Project">
    <InsertItemTemplate>
        <asp:DropDownList ID="lstProjectOverall" Width="250px" runat="server" DataTextField="ProjectName" DataSourceID="ObjectDataSourcePOs" DataValueField="ID" AppendDataBoundItems="False"></asp:DropDownList>
    </InsertItemTemplate>
</asp:TemplateField>

<asp:ObjectDataSource ID="ObjectDataSourceProject" runat="server" InsertMethod="AddProject" OldValuesParameterFormatString="{0}" SelectMethod="GetProjects" TypeName="Projects" OnInserting="ObjectDataSourceProject_Inserting" >
    <InsertParameters>
        <asp:Parameter Name="CountryID" Type="Object" />
        <asp:Parameter Name="Name" Type="String" />
        <asp:Parameter Name="Objective" Type="String" />
        <asp:Parameter Name="ObjectiveQuantitativ" Type="String"/>
        <asp:Parameter Name="ProjectYear" Type="Int32" />
        <asp:Parameter Name="BaseCampaign" Type="Boolean" />
        <asp:Parameter Name="ManagerID" Type="Object" />
        <asp:Parameter Name="OrganisationUnitID" Type="Object" />
        <%-- This parameter is different because the ProjectOverall ID is not part of the Project model, thus we insert the DropDownList value --%>
        <asp:ControlParameter ControlID="DetailsViewProject$lstProjectOverall" name="ID" PropertyName="SelectedValue"/>
    </InsertParameters>
</asp:ObjectDataSource>

<asp:ObjectDataSource ID="ObjectDataSourcePOs" runat="server" 
        SelectMethod="GetProjectsOverallByAttributes" TypeName="ProjectsOverall">
        <SelectParameters>
            <asp:ControlParameter ControlID="DetailsViewProject$lstProjectYears" name="ProjectYear" PropertyName="SelectedValue"/>
            <asp:ControlParameter ControlID="DetailsViewProject$lstOEs" name="OrganisationUnitID" PropertyName="SelectedValue"/>
            <asp:ControlParameter ControlID="DetailsViewProject$lstCountries" name="CountryID" PropertyName="SelectedValue"/>
        </SelectParameters>
</asp:ObjectDataSource>

И это решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...