Запись переменных в существующий массив в VB.Net - PullRequest
3 голосов
/ 29 июля 2011

В настоящее время я разрабатываю макет системы бронирования клиентов для кинотеатра с использованием Framework 4.0. Все данные в настоящее время будут храниться в массиве, и, поскольку это макет, они останутся их (имя клиента, цена билета и т. Д.), Поскольку нет необходимости постоянно хранить данные в это время.

У меня есть форма графического интерфейса и два основных класса, MainForm.vb для обработки функций ввода-вывода приложения и SeatManager.vb для управления фоновыми методами, которые должны запускаться для работы программы. Код для каждого класса приведен ниже: -

**MainForm.vb Class**
    Public Class MainForm
        Private Const m_totalNumberOfSeats As Integer = 60
        Private m_seatManager As SeatManager

        Public Sub New()

            InitializeComponent()
            m_seatManager = New SeatManager(m_totalNumberOfSeats)
            InitializeGUI()
        End Sub

        ''' <summary>
        ''' Method called from the MainForm() method. This method is called when the form
        ''' is opened by the program (on initialisation).
        ''' </summary>
        Private Sub InitializeGUI()
            rbtnReservation.Checked = True              'Sets the Reserve button as being chosen
            lstReservations.Items.Clear()               'Clears the list displaying all seats and reservations
            txtCustomerName.Text = String.Empty         'Sets the name textbox as emtpy
            txtSeatPrice.Text = String.Empty

            cmbDisplayOptions.Items.AddRange([Enum].GetNames(GetType(SeatManager.DisplayOptions)))
            cmbDisplayOptions.SelectedIndex = SeatManager.DisplayOptions.AllSeats

            For i As Integer = 0 To m_totalNumberOfSeats - 1
                lstReservations.Items.Add(GetMyString(i))
            Next
        End Sub
        Private Function GetMyString(ByVal i As Integer) As String
            If i >= 0 AndAlso i < m_totalNumberOfSeats Then
                Return String.Format("{0}{1}{2}{3}", GetPaddedString(m_seatManager.MyArray(i, 0), 29), _
                                     GetPaddedString(m_seatManager.MyArray(i, 1), 41), _
                                     GetPaddedString(m_seatManager.MyArray(i, 2), 63), _
                                     m_seatManager.MyArray(i, 3))
            Else
                Return String.Empty
            End If
        End Function

        Private Function GetPaddedString(ByVal o As Object, ByVal length As Integer) As String
            Dim s As String = String.Empty
            If o IsNot Nothing Then s = o.ToString()
            If s.Length > length Then s = s.Substring(0, length)
            Return s.PadRight(length - s.Length)
        End Function

        '--Event Handler when you change the value of Customer Name/Price
        '    Dim index As Integer = lstBox.selectedIndex
        'm_arrayClass.PopulateArray(index,customerName.text, ctype(price.text,double))
        'lstBox.Items(index) = GetMyString(index)

        'Private Function CheckSelectedIndex() As Boolean
        '    If lstReservations.SelectedIndex <= 0 Then
        '        Return lstReservations.SelectedIndex
        '    Else
        '        Return False
        '    End If
        'End Function

        ''' <summary>
        ''' Method uses to verify that the user has entered text within the txtName textbox
        ''' </summary>
        ''' <param name="name">String variable passing the customer name inputted by the user</param>
        ''' <returns>True if validation confirms user has entered at least one character in
        ''' the txtName field otherwise returns False. If returns false, an error message will
        ''' be displayed to the user</returns>
        Private Function ReadAndValidateName(ByRef name As String) As Boolean
            If (String.IsNullOrEmpty(txtCustomerName.Text)) Or (String.IsNullOrEmpty(txtCustomerName.Text)) Then
                MessageBox.Show("You have not entered a valid customer name. Please try again", _
                                "Invalid Customer Name", MessageBoxButtons.OK)
                txtCustomerName.Focus()
                txtCustomerName.SelectAll()
                Return False
            Else
                Return True
            End If
        End Function

        ''' <summary>
        ''' This method calls the GetDouble() method in the InputUtility class to convert the text
        ''' given by the user in the txtPrice textbox. 
        ''' </summary>
        ''' <param name="seatPrice">Output parameter receiving the converted value</param>
        ''' <returns>True if conversion is successful and validates or False. If returns False
        ''' an error message will be displayed to the user.</returns>
        Private Function ReadAndValidatePrice(ByRef seatPrice As Double) As Boolean
            If (InputUtility.GetDouble(txtSeatPrice.Text, seatPrice) And (seatPrice >= 0)) Then
                Return True
            Else
                MessageBox.Show("You have not entered a valid price. Please try again", _
                                "Invalid Price", MessageBoxButtons.OK)
                txtSeatPrice.Focus()
                txtSeatPrice.SelectAll()
                Return False
            End If
        End Function

        ''' <summary>
        ''' This method calls the above two methods (validate name and validate price) and if both return true, 
        ''' this method also returns true. If either of the above two methods are false, this method returns false
        ''' </summary>
        ''' <param name="name">Output Parameter - customer name</param>
        ''' <param name="seatPrice">Output parameter - seat price</param>
        ''' <returns>Returns true if validates and false if not</returns>
        Private Function ReadAndValidateInput(ByRef name As String, ByRef seatPrice As Double) As Boolean
            Dim nameResult As Boolean = ReadAndValidateName(name)
            Dim priceResult As Boolean = ReadAndValidatePrice(seatPrice)

            Return ((nameResult) And (priceResult))
        End Function

        Private Sub btnExitApplication_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExitApplication.Click

            Dim msgConfirmation As Integer
            msgConfirmation = MessageBox.Show("Are You Sure You Wish To Exit This Application?", "WARNING!", _
                                              MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
            If msgConfirmation = vbYes Then
                Application.Exit()
            End If
        End Sub
    End Class




**SeatManager.vb Class**            
    Public Class SeatManager
        Private _array(,) As Object
        Dim m_totalNumberOfSeats As Integer

        Public Sub New(ByVal maxNumberOfSeats As Integer)
            m_totalNumberOfSeats = maxNumberOfSeats
            ReDim _array(m_totalNumberOfSeats - 1, 3)
            For i As Integer = 0 To m_totalNumberOfSeats - 1
                PopulateArray(i, Nothing, 0.0)
            Next
        End Sub

        Public ReadOnly Property MyArray() As Object(,)
            Get
                Return _array
            End Get
        End Property

        Public Enum DisplayOptions
            AllSeats
            VacantSeats
            ReservedSeats
        End Enum

        Public Sub PopulateArray(ByVal i As Integer, ByVal CustomerName As String, ByVal Price As Double)
            Dim av As String = "Available"
            If Not String.IsNullOrEmpty(CustomerName) Then av = "Not Available"
            'Did you say this has to be handled in an enum?

            _array(i, 0) = i + 1 'Seat Number
            _array(i, 1) = av
            _array(i, 2) = CustomerName
            _array(i, 3) = Price
        End Sub
    End Class

То, чего я сейчас хочу добиться, это то, что у меня есть текстовое поле с именем txtCustomerName и текстовое поле с именем txtPrice. Когда пользователь вводит имя и цену в эти поля и выбирает запись в списке lstReservations, я бы хотел, чтобы статус менялся с Доступно на «Зарезервировано», а Имя клиента и Цена вводились в соответствующие поля массива. .

Есть предложения? Заранее спасибо

1 Ответ

1 голос
/ 02 августа 2011

Вот очень простой способ реализовать базу данных в памяти, используя типизированные наборы данных и xml.Вы можете создать типизированный набор данных для хранения ваших данных в памяти и даже использовать структуру реляционной базы данных для обеспечения целостности данных.Вы можете внести изменения в память этих данных и сохранить данные в файл XML и перезагрузить этот файл при следующем запуске, или вы можете просто отбросить его и заново создать его при каждом запуске.

Вот примеркод для создания образца данных и заполнения набора данных.Вы можете написать код для запроса набора данных во время выполнения, как в реальной базе данных.

    Dim SampleDataFileName = "c:\sampledata.xml"

    Dim ds As New dsReservations

    Try
        ds.ReadXml(SampleDataFileName)
    Catch ex As Exception

    End Try

    If ds.Event.Rows.Count = 0 Then
        'No data yet...initialize sample
        ds.Seat.AddSeatRow(1, "21B")
        ds.Seat.AddSeatRow(2, "21C")
        ds.Seat.AddSeatRow(3, "21D")

        ds.Customer.AddCustomerRow(1, "Bob")
        ds.Customer.AddCustomerRow(2, "Ed")
        ds.Customer.AddCustomerRow(3, "Sally")

        ds.Event.AddEventRow(1, #1/1/2012#, "Concert in the park")
        ds.Event.AddEventRow(2, #5/1/2012#, "Parade")



        Dim drRes1 = ds.Reservation.NewReservationRow
        drRes1.EventId = 1
        drRes1.SeatId = 2
        drRes1.CustomerId = 2
        ds.Reservation.AddReservationRow(drRes1)

        'Save our sample data
        ds.WriteXml(SampleDataFileName)
    End If

    'Spit out all our data (ASP.NET)'
    Response.Write(ds.GetXml())

Вот набор данных, назовите его "dsReservations.xsd".Он имеет четыре связанные таблицы («Событие», «Место», «Заказчик» и «Резервирование»).

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="dsReservations" targetNamespace="http://tempuri.org/dsReservations.xsd" xmlns:mstns="http://tempuri.org/dsReservations.xsd" xmlns="http://tempuri.org/dsReservations.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop" attributeFormDefault="qualified" elementFormDefault="qualified">
  <xs:annotation>
    <xs:appinfo source="urn:schemas-microsoft-com:xml-msdatasource">
      <DataSource DefaultConnectionIndex="0" FunctionsComponentName="QueriesTableAdapter" Modifier="AutoLayout, AnsiClass, Class, Public" SchemaSerializationMode="IncludeSchema" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
        <Connections />
        <Tables />
        <Sources />
      </DataSource>
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="dsReservations" msdata:IsDataSet="true" msdata:UseCurrentLocale="true" msprop:Generator_DataSetName="dsReservations" msprop:Generator_UserDSName="dsReservations">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Customer" msprop:Generator_TableClassName="CustomerDataTable" msprop:Generator_TableVarName="tableCustomer" msprop:Generator_TablePropName="Customer" msprop:Generator_RowDeletingName="CustomerRowDeleting" msprop:Generator_UserTableName="Customer" msprop:Generator_RowChangingName="CustomerRowChanging" msprop:Generator_RowEvHandlerName="CustomerRowChangeEventHandler" msprop:Generator_RowDeletedName="CustomerRowDeleted" msprop:Generator_RowEvArgName="CustomerRowChangeEvent" msprop:Generator_RowChangedName="CustomerRowChanged" msprop:Generator_RowClassName="CustomerRow">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="CustomerId" msprop:Generator_ColumnVarNameInTable="columnCustomerId" msprop:Generator_ColumnPropNameInRow="CustomerId" msprop:Generator_ColumnPropNameInTable="CustomerIdColumn" msprop:Generator_UserColumnName="CustomerId" type="xs:int" />
              <xs:element name="CustomerName" msprop:Generator_ColumnVarNameInTable="columnCustomerName" msprop:Generator_ColumnPropNameInRow="CustomerName" msprop:Generator_ColumnPropNameInTable="CustomerNameColumn" msprop:Generator_UserColumnName="CustomerName" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Event" msprop:Generator_TableClassName="EventDataTable" msprop:Generator_TableVarName="tableEvent" msprop:Generator_TablePropName="Event" msprop:Generator_RowDeletingName="EventRowDeleting" msprop:Generator_UserTableName="Event" msprop:Generator_RowChangingName="EventRowChanging" msprop:Generator_RowEvHandlerName="EventRowChangeEventHandler" msprop:Generator_RowDeletedName="EventRowDeleted" msprop:Generator_RowEvArgName="EventRowChangeEvent" msprop:Generator_RowChangedName="EventRowChanged" msprop:Generator_RowClassName="EventRow">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="EventId" msprop:Generator_ColumnVarNameInTable="columnEventId" msprop:Generator_ColumnPropNameInRow="EventId" msprop:Generator_ColumnPropNameInTable="EventIdColumn" msprop:Generator_UserColumnName="EventId" type="xs:int" />
              <xs:element name="EventDate" msprop:Generator_ColumnVarNameInTable="columnEventDate" msprop:Generator_ColumnPropNameInRow="EventDate" msprop:Generator_ColumnPropNameInTable="EventDateColumn" msprop:Generator_UserColumnName="EventDate" type="xs:dateTime" minOccurs="0" />
              <xs:element name="EventName" msprop:Generator_ColumnVarNameInTable="columnEventName" msprop:Generator_ColumnPropNameInRow="EventName" msprop:Generator_ColumnPropNameInTable="EventNameColumn" msprop:Generator_UserColumnName="EventName" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Seat" msprop:Generator_TableClassName="SeatDataTable" msprop:Generator_TableVarName="tableSeat" msprop:Generator_TablePropName="Seat" msprop:Generator_RowDeletingName="SeatRowDeleting" msprop:Generator_UserTableName="Seat" msprop:Generator_RowChangingName="SeatRowChanging" msprop:Generator_RowEvHandlerName="SeatRowChangeEventHandler" msprop:Generator_RowDeletedName="SeatRowDeleted" msprop:Generator_RowEvArgName="SeatRowChangeEvent" msprop:Generator_RowChangedName="SeatRowChanged" msprop:Generator_RowClassName="SeatRow">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="SeatId" msprop:Generator_ColumnVarNameInTable="columnSeatId" msprop:Generator_ColumnPropNameInRow="SeatId" msprop:Generator_ColumnPropNameInTable="SeatIdColumn" msprop:Generator_UserColumnName="SeatId" type="xs:int" />
              <xs:element name="SeatLocation" msprop:Generator_ColumnVarNameInTable="columnSeatLocation" msprop:Generator_ColumnPropNameInRow="SeatLocation" msprop:Generator_ColumnPropNameInTable="SeatLocationColumn" msprop:Generator_UserColumnName="SeatLocation" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Reservation" msprop:Generator_TableClassName="ReservationDataTable" msprop:Generator_TableVarName="tableReservation" msprop:Generator_TablePropName="Reservation" msprop:Generator_RowDeletingName="ReservationRowDeleting" msprop:Generator_UserTableName="Reservation" msprop:Generator_RowChangingName="ReservationRowChanging" msprop:Generator_RowEvHandlerName="ReservationRowChangeEventHandler" msprop:Generator_RowDeletedName="ReservationRowDeleted" msprop:Generator_RowEvArgName="ReservationRowChangeEvent" msprop:Generator_RowChangedName="ReservationRowChanged" msprop:Generator_RowClassName="ReservationRow">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="EventId" msprop:Generator_ColumnVarNameInTable="columnEventId" msprop:Generator_ColumnPropNameInRow="EventId" msprop:Generator_ColumnPropNameInTable="EventIdColumn" msprop:Generator_UserColumnName="EventId" type="xs:int" />
              <xs:element name="SeatId" msprop:Generator_ColumnVarNameInTable="columnSeatId" msprop:Generator_ColumnPropNameInRow="SeatId" msprop:Generator_ColumnPropNameInTable="SeatIdColumn" msprop:Generator_UserColumnName="SeatId" type="xs:int" />
              <xs:element name="CustomerId" msprop:Generator_ColumnVarNameInTable="columnCustomerId" msprop:Generator_ColumnPropNameInRow="CustomerId" msprop:Generator_ColumnPropNameInTable="CustomerIdColumn" msprop:Generator_UserColumnName="CustomerId" type="xs:int" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:unique name="Constraint1" msdata:PrimaryKey="true">
      <xs:selector xpath=".//mstns:Customer" />
      <xs:field xpath="mstns:CustomerId" />
    </xs:unique>
    <xs:unique name="Event_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
      <xs:selector xpath=".//mstns:Event" />
      <xs:field xpath="mstns:EventId" />
    </xs:unique>
    <xs:unique name="Seat_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
      <xs:selector xpath=".//mstns:Seat" />
      <xs:field xpath="mstns:SeatId" />
    </xs:unique>
    <xs:unique name="Reservation_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
      <xs:selector xpath=".//mstns:Reservation" />
      <xs:field xpath="mstns:EventId" />
      <xs:field xpath="mstns:SeatId" />
    </xs:unique>
    <xs:unique name="Constraint2">
      <xs:selector xpath=".//mstns:Reservation" />
      <xs:field xpath="mstns:EventId" />
    </xs:unique>
    <xs:keyref name="FK_Event_Reservation" refer="Event_Constraint1" msprop:rel_Generator_UserChildTable="Reservation" msprop:rel_Generator_ChildPropName="GetReservationRows" msprop:rel_Generator_ParentPropName="EventRow" msprop:rel_Generator_UserRelationName="FK_Event_Reservation" msprop:rel_Generator_RelationVarName="relationFK_Event_Reservation" msprop:rel_Generator_UserParentTable="Event">
      <xs:selector xpath=".//mstns:Reservation" />
      <xs:field xpath="mstns:EventId" />
    </xs:keyref>
    <xs:keyref name="FK_Seat_Reservation" refer="Seat_Constraint1" msprop:rel_Generator_UserChildTable="Reservation" msprop:rel_Generator_ChildPropName="GetReservationRows" msprop:rel_Generator_ParentPropName="SeatRow" msprop:rel_Generator_UserRelationName="FK_Seat_Reservation" msprop:rel_Generator_RelationVarName="relationFK_Seat_Reservation" msprop:rel_Generator_UserParentTable="Seat">
      <xs:selector xpath=".//mstns:Reservation" />
      <xs:field xpath="mstns:SeatId" />
    </xs:keyref>
    <xs:keyref name="FK_Customer_Reservation" refer="Constraint1" msprop:rel_Generator_UserChildTable="Reservation" msprop:rel_Generator_ChildPropName="GetReservationRows" msprop:rel_Generator_ParentPropName="CustomerRow" msprop:rel_Generator_UserRelationName="FK_Customer_Reservation" msprop:rel_Generator_RelationVarName="relationFK_Customer_Reservation" msprop:rel_Generator_UserParentTable="Customer">
      <xs:selector xpath=".//mstns:Reservation" />
      <xs:field xpath="mstns:CustomerId" />
    </xs:keyref>
  </xs:element>
</xs:schema>

Существует множество примеров запросов к типизированным таблицам данных.Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...