テキストボックスがある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>
感謝。
はい、AddRow(0)は、ウィンドウが読み込まれるときに呼び出されます。 AddRow(1)、AddRow(2)、AddRow(3)...テストのためにMainWindow_Loadedに追加すると正しく動作します。 – user1139683
これは意味があります。すべてのボタンが行0に追加されるように、位置の増分を行うことは決してありません。そのため、すべてのボタンはクリックされたときに0を返します。 – evasilchenko
私は正確に "増分"しようとしていません。 Grid.GetRow(btnSender)が動作していたら、新しい行を追加する位置が得られます。代わりに、Grid.GetRow(btnSender)は常に0を返します。さらに完全なコードを追加しました。私が "row = Grid.GetRow(btnSender)"を "row = myGrid.RowDefinitions.Count"に置き換えると、プログラムは私が望むようにほぼ動作します。 – user1139683