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;
}
}
}
それはクラスと間違って気にいらないですか?