Excel uygulamasını WPF datagrid'e aktarmaya çalışıyorum. Sütun A'ya veri gireceğim ve B sütununda previus hücresi ve A sütununun mevcut hücresini alarak hesaplama yapmayı ve Column B previus hücresini eklemeyi istiyorum. hesaplama örneği: B2 = B1 + (A2-A1). Bunu yapmanın en iyi yolu nedir?DataGrid hesaplanan sütunlar
cevap
, ben kayıtları temsil eder ve o INotifyPropertyChanged sınıf üzerinde uygulamak bir sınıf oluşturarak başlardım. Eğer veri kılavuzunu gösteriyorsanız pencerenin arkasında kodunuzu
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));
}
}
}
Ardından, listedeki her bir nesne üzerinde PropertyChanged abone olmak isteyeceksiniz. Daha sonra, bu özellikler değiştiğinde sütun değerlerini el ile hesaplamanız gerekir. Ick, biliyorum ama işe yarayacaktı. Böylece, ciltlenmiş listedeki tüm kayıtları üzerine bu olay kanca, o zaman herhangi özelliği her değiştiğinde ateş edeceğiz,
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.
}
}
:
mülkiyet değiştirilen etkinlik gibi görünecektir. Yukarıdaki sınıfta, bu hem A hem de B için geçerli olacaktır. İzleme ile ilgilendiğiniz mülkleri e.PropertyName (basit bir dize karşılaştırması) aracılığıyla filtreleyebilir ve iş mantığını buna göre uyarlayabilirsiniz. Kapsüllemeyi korumak ya da en azından, nesnenin iş mantığını nesnenin kendisine koymak istiyorsanız, bu yöntem, recordObject sınıfında durağan olabilir. Bu statik yöntemden datagrid'i tutmayı sağlamanız gerekir (muhtemelen pencerenizdeki statik özellik sayesinde). Yani:
public static void recordObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
ve böylece bağlantı:
record.PropertyChanged += new PropertyChangedEventHandler(recordObject.recordObject_PropertyChanged);
Wow eklemek nasıl anlayamıyorum, bu için çok detaylı bir cevap. Anladığım kadarıyla cevabınız, şu anda karşılanıp karşılanmayan Sütun B'nin otomatik güncellemesine odaklanıyor. Şu anda aradığım şey olayın ardındaki iş mantığı. – Jim
Daha spesifik olabilir misiniz, Jim? Sorunuzda iş mantığı ile sahip olduğunuz her şey B2 = B1 + (A2-A1). Sorunun daha genel olduğunu sanıyordum, o yüzden ne alacağından emin değilim. –
Cevap olarak işaretleyeceğim, ancak önerdiğin şeyleri incelemek zorundayım ve çok fazla deneme yapmam lazım :) – Jim
En iyi şey, bu mantığı bir sınıfta uygulamak ve ızgarayı ilgili özelliklere bağlamaktır. Örneğin: Şahsen
class SomeData
{
int A { get; set; }
int B { get; set; }
int AminusB { get { return A - B; } }
}
Bu kesin çözüm, başarılı olmaya çalışılan için işe yaramaz. SomeData'nın her bir örneğinin, önceki SomeData'daki A ve B değerlerine bağlı olarak her seferinde B'yi hesaplamak için önceki SomeData'ye bir başvurusu olması gerekir. –
İyi yakaladın, Adam. Cevabımda da bunu kaçırdım. –
Teşekkürler. Çözümünüzü (Nick ve Jacob) aynı satırda herhangi bir sorun olmadan hesaplama yapmak için uyguladım. Ancak hala önceki satır Hücre almak ve şimdiki satırın Hücre B2 = B1 + (A2-A1) – Jim
Bekle. Sadece bunu yakaladım. "Önceki hücre" ile önceki * satırında * demek istiyor musunuz? –
Evet, aynı sütunun önceki satırının hücresi. Geçerli satır 2, yani hücrede (B2) bir hesaplama yapmak istiyorum = B1 + (A2-A1) – Jim