2012-02-20 3 views
0

У меня есть встроенный listview (в пределах другого списка), и оба списка просмотра успешно выполняют операции CRUD.ASP.NET 4.0 с использованием DynamicControl во встроенном Listview

АГУ для встроенного ListView выглядит следующим образом:

<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 внешней установки значения по умолчанию для выбора параметра на встроенном ObjectDataSource, как так ListView:

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, когда я изменить какие-либо элементы управления для динамического управления на внутреннем (гнездовом) 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 во вложенном ListView. Есть ли какие-либо обходные пути, или есть ошибка в моем коде, который мне не хватает? Большое спасибо за любую помощь.

ответ

0

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

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

protected void infusionConcLV_init(object sender, EventArgs e) 
    { 
     ListView thisLV = (ListView)sender; 
     thisLV.EnableDynamicData(typeof(infusionConcentration)); 
    }