2012-01-09 27 views
0

テキストボックスがあるWPFグリッドの行を取得するのに問題があります。 1つのRowDefinitionで始まるグリッドがあります。その行には、その行の下のグリッドに別の行定義を追加する「追加」ボタンが含まれています。この新しい行には、同じ機能を実行する「追加」ボタンも含まれています。Grid.GetRow()は常に0を返します

私が午前問題は、私は同じ機能、関連項目GetRow()は正しい値を返します呼び出すXAMLでボタンを宣言すると、関数GetRowを()は常に0

を返すということです。この問題は、ボタンがコードビハインドで作成されていることに由来しているようです。

これは、ボタン「追加」のクリックイベント処理する関数である:、

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 and Grid.GetColumn keep returning 0

EDIT:

はここに私のコードです。私はそれが入っていたプロジェクトから抜き出し、テストのための新しいプロジェクトを作成しました。あなたの助けのための

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

初めて「追加」ボタンをクリックする前にAddRow関数を呼び出すことはありますか?それ以上のコードがなければ、なぜこれが機能していないのかは分かりません。彼らはすべて0を返し、なぜあなたはそう、すべてのボタンがそれを0行に追加され、この関数に渡される位置変数のインクリメントをしない

さ:

アップデートは、真の問題を反映してGetRowを呼び出すとき

+0

はい、AddRow(0)は、ウィンドウが読み込まれるときに呼び出されます。 AddRow(1)、AddRow(2)、AddRow(3)...テストのためにMainWindow_Loadedに追加すると正しく動作します。 – user1139683

+0

これは意味があります。すべてのボタンが行0に追加されるように、位置の増分を行うことは決してありません。そのため、すべてのボタンはクリックされたときに0を返します。 – evasilchenko

+0

私は正確に "増分"しようとしていません。 Grid.GetRow(btnSender)が動作していたら、新しい行を追加する位置が得られます。代わりに、Grid.GetRow(btnSender)は常に0を返します。さらに完全なコードを追加しました。私が "row = Grid.GetRow(btnSender)"を "row = myGrid.RowDefinitions.Count"に置き換えると、プログラムは私が望むようにほぼ動作します。 – user1139683

関連する問題