ASP.NET 4.0 с использованием DynamicControl во встроенном ListView - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть встроенный просмотр списка (в другом просмотре списка), и оба просмотра списка успешно разрешают операции CRUD.

asp для встроенного просмотра списка выглядит следующим образом:

<asp:ObjectDataSource ID="objConcentrations" runat="server" 
      TypeName="PICUdrugs.BLL.infusionBL" DataObjectTypeName="PICUdrugs.DAL.infusionConcentration"
       InsertMethod="insertConcentration" SelectMethod="getConcentrations"
       deleteMethod="deleteConcentration" UpdateMethod="updateConcentration"
       OldValuesParameterFormatString="orig{0}" ConflictDetection="CompareAllValues" 
       OnUpdated="objConcentrations_CRUD" OnInserted="objConcentrations_CRUD">                      
       <SelectParameters>                         
             <asp:Parameter Name="infDilutionID" Type="Int32"/>                      
        </SelectParameters>                   
</asp:ObjectDataSource>
<asp:ListView ID="infusionConcListView" runat="server" DataSourceID="objConcentrations"
        ItemPlaceholderID="itemPlaceHolder1" InsertItemPosition="LastItem" DataKeyNames="infusionConcentrationID"
        OnDataBound="concentrationLV_allDataBound" EnableViewState="False">

сСобытие onItemDataBound внешнего просмотра списка устанавливает значение по умолчанию для параметра select во встроенном objectDataSource следующим образом:

protected void infDilutnLV_itemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        ObjectDataSource infConcentrations = e.Item.FindControl("objConcentrations") as ObjectDataSource;
        ListViewDataItem dataItem = (ListViewDataItem)e.Item;
        if (infConcentrations != null)
        {
            infusionDilution infDil = (infusionDilution)dataItem.DataItem;
            Parameter parameter = infConcentrations.SelectParameters[0];
            parameter.DefaultValue = infDil.infusionDilutionID.ToString();
        }
    } 
}

Затем objectDataSource использует инфраструктуру сущностей на уровне доступа к данным.Я установил dataAnnotations для классов сущностей следующим образом:

namespace PICUdrugs.DAL
{
    [MetadataType(typeof(infusionDilutionMetaData))]
    public partial class infusionDilution
    {
    }
    public class infusionDilutionMetaData
    {
        [Range(0, 3000, ErrorMessage = "volume must be between 0 and 3000 ml")]
        public int? finalVol { get; set; }
    }
    [MetadataType(typeof(infusionConcentrationMetaData))]
    public partial class infusionConcentration
    {
    }
    public class infusionConcentrationMetaData
    {
        [Range(0.001, 1000, ErrorMessage = "concentration must be between 0.001 and 1000 units/ml")]
        public double Concentration { get; set; }
    }
}

В то время как dynamicControls отлично работают на внешнем (не вложенном) представлении списка, когда я меняю любые элементы управления на динамические элементы управления на внутреннем (вложенном) listview, я получаю сообщение об ошибке:

Could not determine a MetaTable. A MetaTable could not be determined for the data source 'objConcentrations' and one could not be inferred from the request URL. Make sure that the table is mapped to the dats source, or that the data source is configured with a valid context type and table name, or that the request is part of a registered DynamicDataRoute.

я боюсь, что я очень программист-любитель, и я не уверен, возможно ли вообще использовать dynamicFields во вложенном просмотре списка.Есть ли обходные пути, или в моем коде есть ошибка, которую я пропускаю?Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 21 февраля 2012

Не могу поверить, что я этого не видел - извините, если я впустую потратил время.

В то время как Page_Init устанавливает EnableDynamicData внешнего ListView, мне нужно использовать обработчик onInit для вложенного ListView:

    protected void infusionConcLV_init(object sender, EventArgs e)
    {
        ListView thisLV = (ListView)sender;
        thisLV.EnableDynamicData(typeof(infusionConcentration));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...