簡體   English   中英

在WPF中更改Datagrid單元格文本時放置一個listview控件

[英]Position a listview control when Datagrid cell text change in wpf

我有一個帶有5列的Datagrid控件,分別是項目代碼,項目名稱,數量,費率,金額。 我想在Datagrid的“項目名稱”列上的單元格中鍵入內容時,在Listview控件上填充“項目”。 listview必須出現在我鍵入的單元格下面。我不知道當單元格textchange時如何獲取Postion listview。請幫助我擺脫這些。

我的窗口看起來像:

 <Grid  Width="900" Height="567" Background="{StaticResource Background}">
      <my:DataGrid Name="dgvSales" BeginningEdit="dgvSales_BeginningEdit" AutoGenerateColumns="False" Margin="13,150,9,117" KeyDown="dgvSales_KeyDown" MouseDown="dgvSales_MouseDown" PreparingCellForEdit="dgvSales_PreparingCellForEdit" MouseRightButtonUp="dgvSales_MouseRightButtonUp">
                    <my:DataGrid.Columns>
                        <my:DataGridTextColumn x:Name="naam" Header="Code" Width="120" Binding="{Binding ProductCode}"></my:DataGridTextColumn>
                        <my:DataGridTextColumn Header="Product Name" Width="200" Binding="{Binding ProductName}"></my:DataGridTextColumn>
                        <my:DataGridComboBoxColumn Header="Unit" Width="100"></my:DataGridComboBoxColumn>
                        <my:DataGridTextColumn Header="Purchase Rate" Width="100" Binding="{Binding PurchaseRate}"></my:DataGridTextColumn>
                        <my:DataGridTextColumn Header="Qty" Width="100" Binding="{Binding Qty}"></my:DataGridTextColumn>
                        <my:DataGridTextColumn Header="Amount" Width="100" Binding="{Binding Amount}"></my:DataGridTextColumn>
                    </my:DataGrid.Columns>
                </my:DataGrid>

<ListView Height="161" ItemsSource="{Binding}" Margin="461,0,51,257" Name="lstvwProductCode" VerticalAlignment="Bottom" Visibility="Collapsed" Width="388">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Record_Id}" Header="Record ID" Width="0" />
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Product_Code}" Header="Pcode" Width="110" />
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Product_Name}" Header="Product" Width="180" />
                        </GridView>
                    </ListView.View>
                </ListView>
</Grid>

您將獲得ListViewItem的費用,如下所示:

FrameworkElement item = (FrameworkElement)DataGrid.ItemContainerGenerator.ContainerFromItem(data);
Point position = item.TranslatePoint(new Point(0, item.ActualHeight), Window.GetWindow(DataGrid));

現在,您可以更改ListView的位置:

ListView.RenderTransform = new TranslateTransform(position.X, position.Y);

編輯:您還可以使用BeginningEdit-Event的EventArgs:

    private void DataGrid_OnBeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        Point newPosition = new Point();
        if (!(lstvwProductCode.RenderTransform is TransformGroup))
            lstvwProductCode.RenderTransform = new TransformGroup();// set the ListView's RenderTransform to a TransformGroup if it isn't already

        DataGrid dg = GetRowsDataGrid(e.Row); //get the Row's corresponding DataGrid with the help of the VisualTreeHelper. You cant use the Column here, because it won't get added to the visual tree.
        if (dg != null)
        {
            double rowX = GetColumnXPosition(e.Column, dg); //get the x position. Here you can't use .TranslatePoint because - again - it doesn't belong to the visual tree, so you have to sum up all columns width' to the column where the changes are made.
            newPosition = e.Row.TranslatePoint(new Point(rowX + 5, e.Row.ActualHeight), this); //translate this point to a point on your main window.
        }

        if (newPosition != new Point())
        {
            Point tPoint = lstvwProductCode.TranslatePoint(new Point(0, 0), this);//add this point
            ((TransformGroup) lstvwProductCode.RenderTransform).Children.Add(
                new TranslateTransform(newPosition.X - tPoint.X, newPosition.Y - tPoint.Y));
        }
    }

    private double GetColumnXPosition(DataGridColumn column, DataGrid grid)
    {
        double result = 0.0;

        if (grid == null)
            return result;

        for (int i = 0; i < grid.Columns.Count; i++)
        {
            DataGridColumn dgc = grid.Columns[i];
            if (dgc.Equals(column))
                break;

            result += dgc.ActualWidth;
        }
        return result;
    }

    private DataGrid GetRowsDataGrid(DataGridRow row)
    {
        DependencyObject result = VisualTreeHelper.GetParent(row);
        while (result != null && !(result is DataGrid))
        {
            result = VisualTreeHelper.GetParent(result);
        }
        return result as DataGrid;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM