Tôi đang cố chuyển ứng dụng excel của mình sang dữ liệu WPF. Tôi sẽ nhập dữ liệu vào Cột A và trong cột B Tôi muốn tính toán lấy ô dự phòng và ô hiện tại của cột A và thêm ô Ưu tiên cột B. ví dụ tính toán: B2 = B1 + (A2-A1). Cách tiếp cận tốt nhất để làm như vậy là gì?Các cột được tính toán DataGrid
Trả lời
Cá nhân, tôi sẽ bắt đầu bằng cách tạo lớp đại diện cho hồ sơ và triển khai INotifyPropertyThay đổi trên lớp đó.
public class recordObject : INotifyPropertyChanged
{
private int a;
public int A
{
get
{
return a;
}
set
{
a = value;
OnPropertyChanged("A");
}
}
private int b;
public int B
{
get
{
return b;
}
set
{
b = value;
OnPropertyChanged("B");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Sau đó, trong mã phía sau cửa sổ bạn đang hiển thị dữ liệu, bạn sẽ muốn đăng ký với PropertyChanged trên từng đối tượng trong danh sách. Sau đó, bạn sẽ phải tính toán giá trị cột theo cách thủ công bất cứ khi nào các thuộc tính đó thay đổi. Ick, tôi biết, nhưng nó hoạt động.
Khu nghỉ dưỡng đã thay đổi sự kiện sẽ như thế nào:
void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
var objectList = DataGrid.ItemsSource as List<recordObject>;
var myRecord = sender as recordObject;
if (objectList != null && myRecord != null)
{
int idx = objectList.IndexOf(myRecord);
// Perform your calculations here using idx to access records before and after the current record
// making sure to check for list boundaries for top and bottom.
// Also note that this will likely kick off cascading event calls so make sure you're only changing
// the previous or following record object.
}
}
Nếu bạn treo sự kiện này vào tất cả các bản ghi trong danh sách ràng buộc của bạn, sau đó nó sẽ bắn bất cứ khi nào tài sản bất kỳ thay đổi. Trong lớp trên, điều đó sẽ áp dụng cho cả A và B. Bạn có thể lọc các thuộc tính bạn quan tâm theo dõi thông qua e.PropertyName (so sánh chuỗi đơn giản) và định lý logic nghiệp vụ cho phù hợp. Nếu bạn muốn duy trì đóng gói, hoặc ít nhất, hãy đặt logic nghiệp vụ cho đối tượng trên chính đối tượng đó, phương thức này có thể là một phương thức tĩnh trên lớp recordObject. Bạn sẽ phải cung cấp cho việc giữ dữ liệu từ phương thức tĩnh đó, mặc dù (có khả năng thông qua một thuộc tính tĩnh trên cửa sổ của bạn). Vì vậy:
public static void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
và kết nối như vậy:
record.PropertyChanged += new PropertyChangedEventHandler(recordObject.recordObject_PropertyChanged);
Wow, đây thực sự là câu trả lời chi tiết nhờ đó. Theo như tôi hiểu câu trả lời của bạn là tập trung vào cập nhật tự động của Cột B, được hoan nghênh nhưng không phải ở giai đoạn hiện tại. Những gì tôi đang tìm kiếm ngay bây giờ là logic kinh doanh đằng sau hiện trường. – Jim
Bạn có thể cụ thể hơn không, Jim? Tất cả bạn đã có bằng cách logic kinh doanh trong câu hỏi của bạn là B2 = B1 + (A2-A1). Tôi nghĩ rằng câu hỏi của bạn là tổng quát hơn vì vậy tôi không chắc chắn những gì bạn đang nhận được. –
Tôi sẽ đánh dấu nó là đã trả lời, tuy nhiên tôi phải nghiên cứu những điều bạn đề xuất và thực hiện nhiều thử và xóa :) – Jim
Điều tốt nhất là triển khai logic đó trong một lớp và liên kết lưới với các thuộc tính tương ứng. Ví dụ:
class SomeData
{
int A { get; set; }
int B { get; set; }
int AminusB { get { return A - B; } }
}
Giải pháp chính xác này sẽ không hoạt động cho những gì đang cố gắng hoàn thành. Mỗi thể hiện của SomeData sẽ phải có một tham chiếu đến SomeData trước đó để tính B mỗi lần phụ thuộc vào các giá trị của A và B trên SomeData trước đó. –
Tốt bắt, Adam. Tôi cũng đã bỏ lỡ câu trả lời của mình. –
Cảm ơn, tôi đã triển khai giải pháp của bạn (Nick và Jacob) để thực hiện phép tính trên cùng một hàng mà không gặp bất kỳ vấn đề gì. Tuy nhiên tôi vẫn không thể hiểu làm thế nào để có được hàng trước tế bào và thêm nó vào hàng hiện tại của tế bào B2 = B1 + (A2-A1) – Jim
Hằng trên. Chỉ cần bắt này. Bởi "ô trước" bạn có ý nghĩa trên hàng * trước *? –
Có, Ô của hàng trước đó của cùng một cột. Hàng hiện tại là 2, vì vậy trong ô (B2), tôi muốn tính toán = B1 + (A2-A1) – Jim