путаница при удалении записей сетки данных и общий доступ к сетке данных - PullRequest
0 голосов
/ 09 мая 2009

У меня есть таблица данных, которую я использую для заполнения с помощью LINQ, затем я добавляю несколько пользовательских столбцов и заполняю их программно - если пользователь нажимает на заголовок столбца для повторной сортировки, все данные в добавленных столбцах исчезают. Я, очевидно, упускаю что-то очень простое здесь, но не вижу леса за деревьями.

У меня также есть пара других вопросов о том, как я делаю вещи:

  1. в моем коде я получаю доступ к пользовательским ячейкам таблицы данных по имени, но в ячейках LINQ мне нужно использовать ссылочный номер ячейки (то есть: (1,2) вместо (всего 2) (я понимаю, что имя заменяется на int) - могу ли я назвать столбцы? Как насчет того, чтобы конечный пользователь переупорядочил их?

Это один из первых случаев, когда я использовал такую ​​сетку данных, поэтому любые указатели были бы хорошими.

LINQ-код для извлечения данных

  Dim query = From m In db.details _
               Where m.InboundDate >= CType(MonthCalendar1.SelectionStart, DateTime) _
               And m.InboundDate <= CType(MonthCalendar1.SelectionEnd, DateTime).AddHours(23).AddMinutes(59) _
               And m.ClientNo = 1 _
               Join md In db.Manifests On md.ManifestID Equals m.MainID _
               Select m.Zone, m.MainID, m.InboundDate, m.Zip, md.LadingPkgQty, m.Weight

код для заполнения данными и добавления столбцов

billingDatagrid.DataSource = query

billingDatagrid.Columns.Add("Package Rate", "Package Rate")
billingDatagrid.Columns.Add("LTL", "LTL Rate")
billingDatagrid.Columns.Add("Freight", "Freight")
billingDatagrid.Columns.Add("Fuel Surcharge", "Fuel Surcharge")
billingDatagrid.Columns.Add("Linehaul", "Linehaul")
billingDatagrid.Columns.Add("Billed Amount", "Billed")

Пример кода доступа к столбцам таблицы данных:

Select Case currentZone
    Case 1
        packageRate = Val(billingDatagrid(4, currentrow).Value) * zone1PkgRate
        billingDatagrid("Package Rate", currentrow).Value = packageRate

        If Val(billingDatagrid(5, currentrow).Value) > 500 Then
            LTLCharge = zone1_ltlBase + (Val(billingDatagrid(5, currentrow).Value) - 500) * zone1_ltlOver
        Else
            LTLCharge = zone1_ltlBase
        End If

        billingDatagrid("LTL", currentrow).Value = LTLCharge

В конце всего этого мне нужно будет создать файл .csv для экспорта - очевидно, важно, чтобы данные correst оставались с каждой строкой!

Заранее спасибо за совет.

Ответы [ 2 ]

0 голосов
/ 09 мая 2009

ОК - это окончательный ответ - код работает и данные остаются там, где и должны -

Спасибо за помощь!

Мой класс:

Public Class GridData

Private _clientno
Private _manifest
Private _packagerate

Public Property PackageRate() As Double
    Get
        Return _packagerate
    End Get
    Set(ByVal value As Double)
        _packagerate = value
    End Set
End Property
Public Property manifest() As String
    Get
        Return _manifest
    End Get
    Set(ByVal value As String)
        _manifest = value
    End Set
End Property
Public Property client() As Int16
    Get
        Return _clientno
    End Get
    Set(ByVal value As Int16)
        _clientno = value
    End Set
End Property

Конечный класс

Линк:

     Dim query = From m In db.details _
            Where m.InboundDate >= CType(MonthCalendar1.SelectionStart, DateTime) _
            And m.InboundDate <= CType(MonthCalendar1.SelectionEnd, DateTime).AddHours(23).AddMinutes(59) _
            And m.ClientNo = 1 _
              Join md In db.Manifests On md.ManifestID Equals m.MainID _
            Select New GridData With {.PackageRate = Nothing, .manifest = m.MainID, .client = m.ClientNo}

   'No No -- billingDatagrid.Columns.Add("PackageRate", "PackageRate")

и небольшой код для заполнения скорости пакета со значением из номера клиента:

   billingDatagrid.DataSource = query
    Dim currentrow As Int16 = 0
    For Each r In billingDatagrid.Rows
        billingDatagrid("PackageRate", currentrow).Value = billingDatagrid("client", currentrow).Value
        currentrow += 1
    Next

Вышеприведенный код теперь работает ...

Спасибо.

0 голосов
/ 09 мая 2009

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

Пример:

Public Class GridData
    Public Zone as (type here)
    ...all your other columns from the query
    Public PackageRate as (type here)
    ...all your other columns you add programatically
End Class

Тогда в запросе вы можете сделать:

Select New GridData with {.Zone=m.Zone, .MainID=m.MainID, .InboundDate=m.InboundDate, .Zip=m.Zip, .LadingPkgQty=md.LadingPkgQty, .Weight=m.Weight, .PackageRate=Nothing, etc }

При этом вы просто назначаете запрос источнику данных, как вы делаете, и все столбцы должны отображаться и все еще оставаться там при обращении. Надеюсь, поможет. Я думаю, что это может решить обе ваши проблемы, так как имена столбцов также должны быть установлены, но я не проверял эту часть.

Edit: Вы можете назначить значение для PackageRate в цикле еще до того, как назначите его источнику данных сетки.

For each row in query
   'you can read and write any of the properties of the GridData Class as row.Client, etc here
Next

Затем присвойте его сетке данных

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