2010-01-30 21 views
6

DevExpress tarafından yapılan XtraGrid Suite ile çalışıyorum. Bunu yapmak için herhangi bir işlevsellik bulamıyorum, ancak ızgara hücresine bir düğme veya köprü ekleyebiliyorsanız merak ediyorum.XtraGrid Suite - bir hücreye düğme veya köprü eklemenin bir yolu var mı?

Bağlam: Bir Etkinlikler listem var. Her Etkinliğin bir Zamanı, Başlangıç ​​/ Bitiş ve Kategori (Yardımcı Program ve Bakım) vardır. Olayları başlat ve Olayları durdur olabilir. Sorunun analizini yaptıktan sonra, her etkinlik için bir StartTime ve EndTime sahip olmayacağına karar verdim.

Yani bir olay başlarsa, geçerli saati Olay nesnesine kaydeder ve 'Başlat' olayı olarak ayarlardım. Bu satırdaki bir hücreye "Durdur" düğmesi/hiperlink eklemek istiyorum. Kullanıcı bir Ends olayını kaydetmek isterse, olay tipi, vb. 'Stop' türü ile yeni bir Event'e kopyalanacak ve buton ortadan kalkacaktır.

Umarım bu mantıklıdır.

DÜZENLEME: Aaronaught'ın cevabı aslında asıl olarak sorduğumdan daha iyi (bir düğme) soruyu güncelledim. Bu şekilde, bir hücreye bir köprü koymak isteyen herkes onun örneğinden yararlanabilir:)

cevap

15

Düğme ölçekleme yapmadığı için çizim kodunu geçersiz kılarak ve fare taşıma/tıklama olaylarını ele alarak köprü stili metin kullanmayı tercih ederim Bir kılavuzun tipik satır yüksekliğine çok iyi. Ancak, bir düğme gerçekten istediğiniz gibi ise, editör türü olarak RepositoryItemButtonEdit'u kullanarak bunu yapabilmeniz gerekir.

Eski ile ilgileniyorsanız, bir yorum bırakın ve bunu bir örnekle güncelleyeceğim. Aksi takdirde, belirtildiği gibi, sadece RepositoryItemButtonEdit kullanın. İsterseniz, hücrenin tamamını almak için özelliklerini değiştirebilir ve ardından düğmenin gerilmemesi için sütunu sabit bir boyutta yapabilirsiniz.


GÜNCELLEME: (a) daha hoş görünüyor, (b) verir, çünkü ben standart bir Köprü hücresinden çok daha iyi gibi aşağıdaki "oldukça köprü" için bazı örnek kodlar, post ediyorum hover geri bildirimi ve (c) isterseniz imleci değiştirebilirsiniz (yerel el imlecini işletim sisteminden elde etmek için bir yardımcı program kullanıyorum; Winform'ların yerleşik elinden daha fazla 3B görünümü var).

DevExpress olmayan kullanıcılar için şunu okuyun:System.Windows.Forms.ListView standardı için neredeyse özdeş bir teknik kullanıyorum. Microsoft bu UI modelini Vista ve Windows 7'de oldukça kullanmaktadır ve sonuç mükemmel çoğaltması olmasa bile nasıl yapılacağını öğrenmek iyidir. Bu kodu hakkında

private int hoverRowHandle = GridControl.InvalidRowHandle; 

private void gridView_Click(object sender, EventArgs e) 
{ 
    if (hoverRowHandle != GridControl.InvalidRowHandle) 
    { 
     MyItem item = gridView.GetRow(hoverRowHandle) as MyItem; 
     if (item != null) 
      // Do whatever the "click" action is here 
    } 
} 

private void gridView_CustomDrawCell(object sender, 
    RowCellCustomDrawEventArgs e) 
{ 
    if (e.Column == linkColumn) 
    { 
     bool hover = (hoverRowHandle == e.RowHandle); 
     FontStyle style = hover ? FontStyle.Underline : FontStyle.Regular; 
     TextFormatFlags formatFlags = 
      TextFormatFlags.Left | TextFormatFlags.VerticalCenter | 
      TextFormatFlags.WordEllipsis; 
     Color foreColor = gridView.IsRowSelected(e.RowHandle) ? 
      Color.White : (hover ? MyColors.LinkHover : MyColors.Link); 
     using (Font font = new Font(gridControl.Font, style)) 
     { 
      TextRenderer.DrawText(e.Graphics, "Link Text", font, e.Bounds, 
       foreColor, formatFlags); 
     } 
     e.Handled = true; 
    } 
} 

private void gridView_MouseLeave(object sender, EventArgs e) 
{ 
    int tempRowHandle = hoverRowHandle; 
    hoverRowHandle = GridControl.InvalidRowHandle; 
    if (tempRowHandle != GridControl.InvalidRowHandle) 
    { 
     gridView.InvalidateRowCell(tempRowHandle, linkColumn); 
    } 
} 

private void gridView_MouseMove(object sender, MouseEventArgs e) 
{ 
    int tempRowHandle = hoverRowHandle; 
    if (tempRowHandle != GridControl.InvalidRowHandle) 
    { 
     hoverRowHandle = GridControl.InvalidRowHandle; 
     gridView.InvalidateRowCell(tempRowHandle, linkColumn); 
    } 
    GridHitInfo hitInfo = gridView.CalcHitInfo(e.Location); 
    if (hitInfo.InRowCell && (hitInfo.Column == linkColumn)) 
    { 
     hoverRowHandle = hitInfo.RowHandle; 
     gridView.InvalidateRowCell(hoverRowHandle, linkColumn); 
    } 

    bool hoverDetail = (hoverRowHandle != GridControl.InvalidRowHandle); 
    gridControl.Cursor = hoverDetail ? Cursors.Hand : Cursors.Default; 
} 

birkaç not:

  • MyItem Tablo görünümüne bağlı olan verilerin ne olursa olsun türüdür. Belki de DataRow veya veri kaynağı IList<T> ise, bazı özel türdür.

  • MyColors, kullanıcı arabirimi öğeleri için kullanılan birkaç public static readonly Color alanını tanımlayan bir yardımcı program sınıfıdır. Sadece bir ızgara üzerinde yapacaksanız, referansları kodlanmış renklerle değiştirebilirsiniz.

  • Font'u önbelleğe almamaya çalışıyorum, ancak muhtemelen bunlardan sadece ikisi var.

  • İmleç mantığı, ızgarada kullanabileceğiniz başka bir imleç mantığına bulaşacaktır (bu, benim için neredeyse her durumda neredeyse hiç yoktur, bu nedenle genellikle iyi olmalısınız).

  • Birden fazla "bağlantısını sütunu" sahip olmak istiyorsanız

    , sen hoverRowHandle ek olarak bir hoverColumn devlet alanını korumak ve tabii ki birden çok sütun aramak için bu tek sütunlu eşitlik karşılaştırmalar değiştirmeniz gerekir.

    Kendi Win uygulamalar için

, Aslında bana sütun adı/bağlantı metni çiftlerinin bir listede savurma bir GridView veya ListView Bu davranışı bağlamak sağlar Extender sağlayıcısı var, ama bu kod sadece bir çiş olduğunu Burada yayınlamak için çok uzun. Yukarıdaki örnek, başlamanızı sağlamalıdır.

+0

Teşekkür teklif için, ben köprü bir exmple görmek isteriz. Bu arada, 'RepositoryItemButtonEdit' çalışmasını kullanacağım. –

+1

@ calico-cat: İşte, söz verildiği gibi! – Aaronaught

+2

Bu cevaba koyduğunuz tüm çabalarınız için çok teşekkür ederim. Keşke bir kereden fazla kazanabilseydim! –

5

RepositoryItemButtonEdit kullanın ve TextEditStyle değerini HideTextEditor olarak ayarlayın.

1

RepositoryItemButtonEdit: hedef sütununuzu seçin, "Properties" de "ColumnEdit" 'e tıklayın ve "ButtonEdit" i seçtikten sonra "new" i seçin. kılavuzunuza tıklayın ve "tasarımcı çalıştır" ı seçin, "Repository" grubunda "yerinde Düzenleyici Havuzu" seçeneğini seçin. "repositoryItemButtonEdit1" öğesini seçin (Button düzenleme bileşeni adını değiştirmediyseniz), "event" sekmesini seçin ve "ButtonPressed" olayını seçin. kodunuzu bu etkinlikte doldurun. eğer isterseniz, editörün bileşenini gizleyin, hedef sütununu seçin, "Özellikler" in "ColumnEdit" e tıklayın, "TextEditStyle" ı bulun ve "HideTextEditor" ı seçin.

Ancak, bir soru! Düğüğüme resim eklemek istiyorum, birinin bir fikri var mı?

+0

bunu yüklemek istiyorum yeni soru. –