0

DHCPサーバーからの構成データがあり、次のようなクラスに入れています。

public class DHCP
{
    public DHCP()
    {
        this.Scopes = new List<Scope>();
    }

    public List<Scope> Scopes;

    public class Scope
    {
        public Scope(string ScopeAddress, string SubnetMask, string State, string ScopeName, string Comment)
        {
            this.ScopeAddress = ScopeAddress;
            this.SubnetMask = SubnetMask;
            this.State = State;
            this.ScopeName = ScopeName;
            this.Comment = Comment;
        }

        public Scope(string ScopeAddress, string SubnetMask, string State, string ScopeName, string Comment, bool initClients)
        {
            this.ScopeAddress = ScopeAddress;
            this.SubnetMask = SubnetMask;
            this.State = State;
            this.ScopeName = ScopeName;
            this.Comment = Comment;

            if (initClients)
                this.Clients = new List<Client>();
        }

        public void InitClients()
        {
            this.Clients = new List<Client>();
        }

        public void InitReservations()
        {
            this.Reservations = new List<Reservation>();
        }

        public string ScopeAddress { get; set; }
        public string SubnetMask { get; set; }
        public string State { get; set; }
        public string ScopeName { get; set; }
        public string Comment { get; set; }

        public List<Client> Clients;
        public List<Reservation> Reservations;
    }

    public class Client
    {
        public Client(string IPAddress, string SubnetMask, string UniqueID, string LeaseExpires, string ClientType)
        {
            this.IPAddress = IPAddress;
            this.SubnetMask = SubnetMask;
            this.UniqueID = UniqueID;
            this.LeaseExpires = LeaseExpires;
            this.ClientType = ClientType;
        }

        public string IPAddress { get; set; }
        public string SubnetMask { get; set; }
        public string UniqueID { get; set; }
        public string LeaseExpires { get; set; }
        public string ClientType { get; set; }
        public Reservation ClientReservation { get; set; }
    }

    public class Reservation
    {
        public Reservation(string IPAddress, string UniqueID, bool ReservationActive)
        {
            this.IPAddress = IPAddress;
            this.UniqueID = UniqueID;
            this.ReservationActive = ReservationActive;
        }

        public string IPAddress { get; set; }
        public string UniqueID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Type { get; set; }
        public bool ReservationActive { get; set; }
    }
}

次に、グリッドビューList<DHCP.Client>で使用するを使用しDataSourceます。データフィールドの1つをに設定するとClientReservation.ReservationActive、見つからないというエラーが発生します。

私はこれをList<>で試しましたが、これはNULLデータではありません。だから私は質問しなければなりません:

これはまったくできますか?オブジェクトがある場合、エラーなしでClient.ClientReservation == nullそれをどのように処理できますか?DataBind()

4

2 に答える 2

0

問題は、ご覧のとおり、コンストラクターで を除くすべてのプロパティに値を割り当てることですReservationActive。実際にはnullのままであり、これがエラーが発生する理由です。したがって、次のことを行う必要があります。

public class Client
{
    public Client(string IPAddress, string SubnetMask, string UniqueID, string LeaseExpires, string ClientType, Reservation ClientReservation)
    {
        this.IPAddress = IPAddress;
        this.SubnetMask = SubnetMask;
        this.UniqueID = UniqueID;
        this.LeaseExpires = LeaseExpires;
        this.ClientType = ClientType;
        this.ClientReservation = ClientReservation;
    }

    public string IPAddress { get; set; }
    public string SubnetMask { get; set; }
    public string UniqueID { get; set; }
    public string LeaseExpires { get; set; }
    public string ClientType { get; set; }
    public Reservation ClientReservation { get; set; }
}

そして、null 以外の値を渡します。それ以外の場合は、コンストラクターを介して渡すことなく、この方法で初期化できます。

Client client = new Client();
client.ClientReservation = new Reservation("127.0.0.1", "ID", true); //example

その後myClient.ClientReservation、エラーなしで使用できます。

編集:

別の提案。いくつかの s を追加する必要があるためですClient。この可能性を次のように実装できます。

public Scope
{
    //...
    public void AddClient(string IPAddress, string SubnetMask, string UniqueID, string LeaseExpires, string ClientType, Reservation ClientReservation){
        Clients.Add(new Client(IPAddress, SubnetMask, UniqueID, LeaseExpires, ClientType, ClientReservation));
    }
}

それで:

Scopes = new List<Scope>();
Scope scope = new Scope(/*...*/);
scope.AddClient(new Client(/*...*/)); 
Scopes.Add(scope);
于 2012-11-03T18:19:53.177 に答える
0

両方の問題の解決策を見つけました。次のようなテンプレート フィールドを使用します。

<asp:TemplateField>
  <ItemTemplate>
    <%#DataBinder.Eval(Container.DataItem, "ClientReservation.ReservationActive")%>
  </ItemTemplate>
 </asp:TemplateField>

ネストされたクラス (サブ プロパティ) の値を取得し、ClientReservation が NULL の場合はエラーなしで無視します。

于 2012-11-04T09:21:39.370 に答える