2016-04-12 12 views
0

私はObjectDataSourceを持っています。すべてのメソッドで静的なクラス状態にバインドします:select、update、insert、deleteはserviceRecordクラスのインスタンスで動作します。それはうまく見えます。 GridViewでバインドすると、GridViewはserviceRecordプロパティを見つけられず、自動的に列を生成することができません。自動生成がなければ例外があります:HttpException(0x80004005): 'serviceStart'という名前のフィールドまたはプロパティが選択されたデータソースで見つかりませんでした。ASP.NET GridViewはプロパティを見つけることができません

 <div style="text-align: center"> 
      <asp:ObjectDataSource ID="ServiceRecordsDataSource" runat="server" 
       DataObjectTypeName="LaretsState.serviceRecord" TypeName="LaretsState.state" 
       DeleteMethod="deleteRecord" InsertMethod="addRecord" 
       SelectMethod="getRecords" UpdateMethod="updateRecord" > 
      </asp:ObjectDataSource> 

      <asp:GridView ID="GridView" runat="server" AutoGenerateColumns="False" 
       ObjectDataSourceId ="ServiceRecordsDataSource" DataSourceID="ServiceRecordsDataSource"> 

       <Columns> 
        <asp:BoundField DataField="serviceStart" DataFormatString="dd:MM:yyyy hh:mm" HeaderText="Date and time of service" /> 
        <asp:BoundField DataField="serviceDuration" DataFormatString="mm" HeaderText="Duration" /> 
        <asp:BoundField DataField="creationTime" DataFormatString="dd.MM.yyyy hh.mm" HeaderText="Creation time" /> 
       </Columns> 

      </asp:GridView> 

クラスは次のとおりです。

 namespace LaretsState 
    { 

     public static class state 
     { 

      public static actualState actualState 
      { get { return new actualState(getActualState(), getNextRecord()); } } 

      private static List<serviceRecord> _plan = new List<serviceRecord>(); 

      static state() { } 

      public static List<serviceRecord> getRecords() 
      { 
       return _plan; 
      } 

      public static void updateRecord(serviceRecord record) 
      { 
       serviceRecord newRecord = record; 
       lock (_plan) 
       { 
        serviceRecord oldRecord = _plan.Where(r=> r.id== record.id).FirstOrDefault(); 
        if (oldRecord == null) 
        { throw new ArgumentException("В плане отсутствует запись с id " + record.id, "recordid"); } 

        var ColissionRecords = GetCollisionRecords(newRecord); 

        if (ColissionRecords.Count() > 1 || 
         ColissionRecords.Count() == 1 && !ColissionRecords.Contains(oldRecord)) 
        { throw new Exception("На предложенное время уже запланировано обслуживание"); } 

        oldRecord = newRecord; 
        //_plan.Remove(oldRecord); 
        //_plan.Add(newRecord); 
       } 
      } 

      public static void deleteRecord(serviceRecord record) 
      { 
       _plan.Remove(record); 
      } 

      public static void addRecord(serviceRecord record) 
      { 
       lock (_plan) 
       { 
        var ColissionRecords = GetCollisionRecords(record); 

        if (ColissionRecords.Count() > 1) 
        { throw new Exception("На предложенное время уже запланировано обслуживание"); } 

        _plan.Add(record); 
       } 
      } 

      private static List<serviceRecord> GetCollisionRecords (serviceRecord record) 
      { 
       return _plan.Where(r => r.serviceStart <= record.serviceStart.Add(record.serviceDuration) 
         && r.serviceStart.Add(r.serviceDuration) > record.serviceStart).ToList(); 
      } 

      private static serviceRecord getNextRecord() 
      { 
       DateTime nowdate = DateTime.Now; 

       if (_plan.Count() == 0) return null; 

       return _plan 
        .Where(r => r.serviceStart > nowdate) 
        .OrderBy(r => r.serviceStart) 
        .First(); 
      } 

      private static serviceState getActualState() 
      { 
       DateTime nowDateTime = DateTime.Now; 
       var recordsInProgress = _plan.Where(r => r.serviceStart <= nowDateTime 
        && r.serviceStart.Add(r.serviceDuration) > nowDateTime).Count(); 

       if (recordsInProgress >0) 
       { return serviceState.OnService; } 
       else 
       { return serviceState.Normal; } 
      } 
    } 
     } 

} 


    namespace LaretsState 
{ 
    [DataContract] 
    public class serviceRecord 
    { 
     private static int lastid = 0; 
    [DataMember] 
    public DateTime serviceStart; 
    [DataMember] 
    public TimeSpan serviceDuration; 
    [DataMember] 
    public readonly DateTime creationTime; 
    [DataMember] 
    public readonly int id; 

    public serviceRecord (DateTime serviceStart, TimeSpan serviceDuration) 
     :this() 
    { 
     this.serviceStart = serviceStart; 
     this.serviceDuration = serviceDuration; 
    } 

    public serviceRecord() 
    { 
     this.creationTime = DateTime.Now; 
     this.id = ++lastid; 
    } 
    } 
} 

それはクラスと間違って気にいらないですか?

答えて

0

見つかりました! serviceRecordクラスでは、フィールドではなくプロパティを使用する必要があります。

[DataMember] 
    public DateTime serviceStart { get; set; } 
    [DataMember] 
    public TimeSpan serviceDuration { get; set; } 
    [DataMember] 
    public DateTime creationTime { get;} 
    [DataMember] 
    public int id { get;} 
関連する問題