c# - 当用户从该单元格更改值时更新单元格值
问题描述
当用户通过键盘输入一些文本来更改单元格值时,我想更新绑定属性值。我编写了显示绑定属性值并且工作正常的代码。但我想知道当用户在特定行的特定单元格中输入一些文本时如何更新单元格值。
假设用户想要更改数量。在 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();
}
解决方案
我找到了解决方案,
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());
}
}
推荐阅读
- amazon-web-services - 新 AWS 云 HSM 中的 PKCS Luna 支持
- npm - 无法启动 webpack-dev-server
- raspberry-pi - Odoo - PosBox 少打印机断开连接
- laravel - Laravel 测试:协调 http-request 和控制器
- angular - AG-Grid Angular 6 m 多线接头
- arrays - 随机混合两个 Numpy 数组
- c# - ldap - 未找到网络路径
- tensorflow - 如果输入被tf.data.TFRecordDataset随机打乱,Tensorflow如何获得输入和输出之间的映射关系
- spring - Spring中特定咖啡因缓存的配置
- android - 使用 getter、setter 和适配器从 firebase 中的特定节点/子节点检索数据,详情请参阅