Grid.GetRow () всегда возвращает 0 - PullRequest
0 голосов
/ 10 января 2012

У меня проблемы с получением строки сетки WPF, в которой находится текстовое поле. У меня есть сетка, которая начинается с одного RowDefinition.Эта строка содержит кнопку «Добавить», которая добавляет другое определение строки в сетку под этой строкой.Эта новая строка также содержит кнопку «добавить», которая выполняет ту же функцию.

Проблема, с которой я столкнулся, заключается в том, что функция GetRow () всегда возвращает 0.

Если я объявлю кнопку вXAML, который вызывает ту же функцию, GetRow () возвращает правильное значение.Кажется, проблема связана с тем, что кнопки создаются в codebehind.

Эта функция обрабатывает событие нажатия кнопок «Добавить»:

Private Sub btnAddRow_Click(ByVal sender As System.Object, _
  ByVal e As System.Windows.RoutedEventArgs)
  Dim btnSender As Button = sender
  Dim row As Integer
  row = Grid.GetRow(btnSender)
  AddRow(row)
End Sub

Функция «AddRow "добавляет новое RowDefinition в сетку, кнопку" добавить "для этой строки и несколько других элементов управления (метка, текстовое поле и т. Д.).

Private Sub AddRow(ByVal position As Integer)
    Dim rd As New RowDefinition()
    rd.Height = New GridLength(35, GridUnitType.Pixel)
    Me.Height += 35
    myGrid.RowDefinitions.Insert(position, rd)
    Dim add As New Button
    add.Content = "Add Row"
    add.HorizontalAlignment = Windows.HorizontalAlignment.Center
    add.VerticalAlignment = Windows.VerticalAlignment.Center
    AddHandler add.Click, AddressOf btnAddRow_Click
    Grid.SetColumn(add, 2)
    Grid.SetRow(add, position)
    myGrid.Children.Add(add)
End Sub

Я нашел эту тему, но использовал" e.Source "или" e.OriginalSource "не решили проблему. Grid.GetRow и Grid.GetColumn продолжают возвращаться 0

РЕДАКТИРОВАТЬ:

Вот мой код.Я вытащил его из проекта, в котором он находился, и создал новый проект для тестирования.

Class MainWindow 
Private Sub btnAddRow_Click(ByVal sender As System.Object, _
                            ByVal e As System.Windows.RoutedEventArgs)
    Dim btnSender As Button = sender
    Dim row As Integer
    row = Grid.GetRow(btnSender)
    row = row + 1
    AddRow(row)
End Sub

Private Sub AddRow(ByVal position As Integer)
    If (myGrid.RowDefinitions.Count < position) Then
        position = myGrid.RowDefinitions.Count
    End If

For Each element In (From i As UIElement In myWaypointGrid.Children Where Grid.GetRow(i) >= position Select i).ToList()
            Grid.SetRow(element, Grid.GetRow(element) + 1)
        Next

    Dim rd As New RowDefinition()
    rd.Height = New GridLength(35, GridUnitType.Pixel)
    Me.Height += 35
    myGrid.RowDefinitions.Insert(position, rd)
    Dim add As New Button
    add.Content = "Add Row " & position
    add.HorizontalAlignment = Windows.HorizontalAlignment.Center
    add.VerticalAlignment = Windows.VerticalAlignment.Center
    AddHandler add.Click, AddressOf btnAddRow_Click
    Grid.SetColumn(add, 2)
    Grid.SetRow(add, position)
    myGrid.Children.Add(add)
End Sub

Private Sub MainWindow_Loaded(ByVal sender As Object, _
                              ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    AddRow(0)
End Sub

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

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid Name="myGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="75" />
    </Grid.ColumnDefinitions>
</Grid>

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 10 января 2012

Вы когда-нибудь вызывали функцию AddRow до первого нажатия кнопки «Добавить»? Без большего количества кода трудно сказать, почему это не работает.

Обновление, чтобы отразить истинную проблему:

Вы не делаете приращение для переменной позиции, которая передается в эту функцию, поэтому все ваши кнопки добавляются в строку 0. Поэтому они все возвращают 0, когда вы вызываете GetRow

...