【问题标题】:update cell in datagrid wpf更新datagrid wpf中的单元格
【发布时间】:2014-04-06 16:59:18
【问题描述】:

我有一个发票程序,用于跟踪客户可能想要购买的所选商品。每次按下“添加项目”按钮时,数量单元格都会增加。我遇到的问题是值在后台升级,但在单元格本身中没有改变。 但是,如果您单击单元格,则该值将更新。但是我希望它在单击“添加项目”按钮后立即更新。单击此按钮时,我可以做些什么来更新单元格信息? 这是我拥有的可与按钮推送一起使用的代码

public partial class MainWindow : Window
}
private void btnAddItem_Click(object sender, RoutedEventArgs e)
    {
        addDataGridRow(invoiceItemID, cbxItems.SelectedItem.ToString(), Convert.ToDouble(txtPrice.Text));
    }

    private void addDataGridRow(int id, string itemName, double itemPrice)
    {
        //lstDataItem.Add(new DataItem { sQTY = count.ToString(), sNAME = itemName, sPRICE = itemPrice, sRemove = "Delete Item" });
       // Rows = new ObservableCollection<DataItem> { new DataItem () };
        for (int i = 0; i < Rows.Count; i++)
        {
            if (Rows[i].sNAME == itemName)
            {
                Rows[i].sQTY = Rows[i].sQTY + 1;
                id = Rows[i].id;
                bSameItem = true;
            }
        }
        if (id == 0)
        {
            Rows.Add(new DataItem());
        }
        else if (!bSameItem)
        {
            Rows.Add(new DataItem());
        }


        if (!bSameItem)
        {
            Rows[id].id = id;
            Rows[id].sQTY = 1;
            Rows[id].sNAME = itemName;
            Rows[id].sPRICE = itemPrice;
            invoiceItemID++;
            dgInvoice.ItemsSource = Rows;

        }
        bSameItem = false;
    }
}

public class DataItem
{
    public int id { get; set; }
    public int sQTY { get; set; }
    public string sNAME { get; set; }
    public double sPRICE { get; set; }
}

我不知道你是否需要我的 xaml,但这是以防万一

        <DataGrid x:Name="dgInvoice" HorizontalAlignment="Left" Margin="10,92,0,0" VerticalAlignment="Top" Height="608" Width="488" AutoGenerateColumns="False" ItemsSource="{Binding}" RowHeight="25">
            <DataGrid.Columns>
                <DataGridTextColumn Header="QTY" Binding="{Binding Path=sQTY}" Width="100"/>
                <DataGridTextColumn Header="NAME" Binding="{Binding Path=sNAME}" Width="200"/>
                <DataGridTextColumn Header="PRICE" Binding="{Binding Path=sPRICE}" Width="80"/>
                <DataGridTemplateColumn Width="100">
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <Button Height="20">Delete Item</Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>

当我搜索这个主题时,我看到的对 wpf 的回复并不多。任何帮助将不胜感激。

【问题讨论】:

    标签: c# wpf xaml datagrid


    【解决方案1】:

    您必须在您的类 DataItem 上实现 INotifyPropertyChanged 接口,以便其属性的任何更改都会反映在 UI 上。

    public class DataItem : INotifyPropertyChanged
    {
       public event PropertyChangedEventHandler PropertyChanged;
    
       private int id;
       public int Id
       {
          get { return id; }
          set
          {
             if(id != value)
             {
                id= value;
                OnPropertyChanged("Id");
             }
          }
       }
    
      // Create the OnPropertyChanged method to raise the event 
      protected void OnPropertyChanged(string name)
      {
         PropertyChangedEventHandler handler = PropertyChanged;
         if (handler != null)
         {
            handler(this, new PropertyChangedEventArgs(name));
         }
      }
    }
    

    使其他属性遵循与上述 Id 相同的语法,您将看到属性值的任何更新都会反映在 GUI 上。

    【讨论】:

    • 它在我的情况下不起作用。我正在更改数据网格中所选项目的值。尽管属性已更改,但它不会立即反映,但是当我双击该行时,它会被反映。当我使用 Items.Refresh() 时,它的工作原理。有什么建议为什么会发生这种情况?
    【解决方案2】:

    我只需要dgInvoices.Items.Refresh();

    【讨论】:

    • 这不是 WPF 中的做法。
    • 至少就我的目的而言它有效,但非常欢迎您告诉我如何实际做到这一点
    • 我已经添加了答案。
    • 它可能适用于您的情况。但是很快当项目大小增加超过 1000 个项目时,您将看到代码的性能问题。您正在做的是任何单个项目更改,刷新集合中的所有项目。迟早会彻底炸毁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2014-10-09
    • 2011-06-29
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多