首页 > 解决方案 > 当用户从该单元格更改值时更新单元格值

问题描述

当用户通过键盘输入一些文本来更改单元格值时,我想更新绑定属性值。我编写了显示绑定属性值并且工作正常的代码。但我想知道当用户在特定行的特定单元格中输入一些文本时如何更新单元格值。

假设用户想要更改数量。在 Quantity 单元格中输入一些值时,如何反映这些更改以绑定属性值和更新数据网格。

注意:还指导如何获取用户新输入的值

<DataGrid  DataGridCell.Selected="DataGrid_GotFocus" SelectionUnit="Cell" 
                   SelectionMode="Single" Name="Datagrid"  AutoGenerateColumns="False" 
                   PreviewKeyDown="Datagrid_PreviewKeyDown" 
                   CurrentCellChanged="Datagrid_CurrentCellChanged" SelectionChanged="Datagrid_SelectionChanged" SelectedCellsChanged="Datagrid_SelectedCellsChanged">

            <DataGrid.Columns>

                <DataGridTextColumn Header="Code" Width="1*" Binding="{Binding Code, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Name" Width="1*" Binding="{Binding Name, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Description" Width="1*" Binding="{Binding Description, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Quantity" Width="1*" Binding="{Binding Quantity, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Unit Price" Width="1*" Binding="{Binding UnitPrice, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Sub-Total" Width="1*" Binding="{Binding SubTotal, Mode=TwoWay}"/>
            </DataGrid.Columns>
        </DataGrid>

我已经实现了运行良好的 curruntcellchanged 事件。这与 Enter 键一样工作,它们从数据库中获取值并更新绑定属性值。现在,之后如果用户更改 Quantity ,那么如何将此更改反映到绑定属性。

 private void Datagrid_CurrentCellChanged(object sender, EventArgs e)
        {
            //MessageBox.Show("cell chnage");
            //Datagrid.BeginEdit();
            if (Datagrid.SelectedCells.Count > 0)
            {
                DataGridCellInfo cell = Datagrid.SelectedCells[0];

                var generator = Datagrid.ItemContainerGenerator;
                int columnIndex = cell.Column.DisplayIndex;
                int rowIndex = generator.IndexFromContainer(generator.ContainerFromItem(cell.Item));

                int counts = Datagrid.Items.Count - 1;
                //MessageBox.Show("total counts: " + counts.ToString() + "Selected index " + rowIndex.ToString() + " column index: " + columnIndex);

                string code = ((Item)Datagrid.Items[rowIndex]).Code;
                Database database = new Database();
                database.DBOpen();

                SQLiteDataReader sQLiteDataReader = database.GetWhere(Database.TABLE_ITEMS, Database.CODE_ITEMS, code);
                while (sQLiteDataReader.Read())
                {
                    string name = sQLiteDataReader.GetString(2);
                    string desc = sQLiteDataReader.GetString(6);
                    string unitPrice = sQLiteDataReader.GetInt64(8).ToString();
                    string quantity = "1";
                    //string subTotal = (double.Parse(quantity) * double.Parse(unitPrice)).ToString();
                    //grossAmount = grossAmount + Double.Parse(subTotal);

                    Item item = new Item()
                    {
                        Code = code,
                        Name = name,
                        Description = desc,
                        Quantity = quantity,
                        UnitPrice = unitPrice,
                        //SubTotal = subTotal
                    };
                    ((Item)Datagrid.Items[rowIndex]).Code = code;
                    ((Item)Datagrid.Items[rowIndex]).Name = name;
                    ((Item)Datagrid.Items[rowIndex]).Description = desc;
                    ((Item)Datagrid.Items[rowIndex]).Quantity = quantity;
                    ((Item)Datagrid.Items[rowIndex]).UnitPrice = unitPrice;
                }
                database.DBClose();
            } 

标签: c#wpfdatagrid

解决方案


我找到了解决方案,

 private void Datagrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
TextBox quantity = e.EditingElement as TextBox;
                DataGridColumn dgc = e.Column;

                if (Datagrid.SelectedCells.Count > 0)
                {
                    DataGridCellInfo cell = Datagrid.SelectedCells[0];

                    var generator = Datagrid.ItemContainerGenerator;
                    int columnIndex = cell.Column.DisplayIndex;
                    int rowIndex = generator.IndexFromContainer(generator.ContainerFromItem(cell.Item));
                    ((Item)Datagrid.Items[rowIndex]).Quantity = quantity.Text.ToString();

                    MessageBox.Show(quantity.Text.ToString());
                }
}

推荐阅读