Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Mitchell
Sıralanmış verilerin uzun bir listesini görüntülerken, ayırıcı satırlar ekleyerek ilgili verileri gruplandırmak çok yararlı olabilir. Bu öğreticide, böyle bir sıralama kullanıcı arabiriminin nasıl oluşturulacağını göreceğiz.
Giriş
Sıralanmış sütunda yalnızca birkaç farklı değerin bulunduğu uzun bir sıralanmış veri listesi görüntülerken, son kullanıcı fark sınırlarının tam olarak nerede olduğunu ayırt etmek zor olabilir. Örneğin, veritabanında 81 ürün vardır, ancak yalnızca dokuz farklı kategori seçeneği vardır (sekiz benzersiz kategori artı NULL
seçenek). Deniz Ürünleri kategorisine giren ürünleri incelemek isteyen bir kullanıcının durumunu düşünün. Tek bir GridView'daki tüm ürünleri listeleyen bir sayfadan, kullanıcı en iyi seçeneğinin sonuçları kategoriye göre sıralamak olduğuna karar verebilir ve bu da tüm Deniz Ürünleri ürünlerini birlikte gruplandıracaktır. Kategoriye göre sıraladıktan sonra, kullanıcının, deniz ürünleri grubundaki ürünlerin nerede başlayıp nerede bittiğini bulmak için listeyi incelemesi gerekir. Sonuçlar, Deniz Ürünleri ürünlerini bulmak kategori adına göre alfabetik olarak sıralandığından zor değildir, ancak yine de kılavuzdaki öğelerin listesini yakından taramayı gerektirir.
Sıralanmış gruplar arasındaki sınırları vurgulamak için birçok web sitesi, bu gruplar arasında ayırıcı ekleyen bir kullanıcı arabirimini devreye alır. Şekil 1'de gösterilenler gibi ayırıcılar, kullanıcının belirli bir grubu daha hızlı bulmasını, sınırlarını tanımlamasını ve verilerde hangi ayrı grupların mevcut olduğunu belirlemesini sağlar.
Şekil 1: Her Kategori Grubu Açıkça Tanımlanmıştır (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu öğreticide, böyle bir sıralama kullanıcı arabiriminin nasıl oluşturulacağını göreceğiz.
1. Adım: Standart, Sıralanabilir GridView Oluşturma
Gelişmiş sıralama arabirimini sağlamak için GridView'u nasıl geliştirebileceğinizi keşfetmeden önce, önce ürünleri listeleyen standart, sıralanabilir bir GridView oluşturalım. Öncelikle CustomSortingUI.aspx
klasöründeki PagingAndSorting
sayfasını açarak başlayın. Sayfaya bir GridView ekleyin, özelliğini ID
olarak ProductList
ayarlayın ve yeni bir ObjectDataSource'a bağlayın. ObjectDataSource'ı kayıtları seçmek için ProductsBLL
sınıfını ve GetProducts()
yöntemini kullanacak şekilde yapılandırın.
Ardından, GridView'ı yalnızca ProductName
, CategoryName
, SupplierName
, UnitPrice
BoundFields ve Sonlandırılan CheckBoxField içerecek şekilde yapılandırın. Son olarak, GridView'ın akıllı etiketinde Sıralamayı Etkinleştir onay kutusunu işaretleyerek (veya AllowSorting
özelliğini true
olarak ayarlayarak) GridView'ı sıralamayı destekleyecek şekilde yapılandırın. Sayfaya CustomSortingUI.aspx
bu eklemeleri yaptıktan sonra bildirim temelli işaretleme aşağıdakine benzer görünmelidir:
<asp:GridView ID="ProductList" runat="server" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="ObjectDataSource1" EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName" HeaderText="Supplier"
ReadOnly="True" SortExpression="SupplierName" />
<asp:BoundField DataField="UnitPrice" DataFormatString="{0:C}"
HeaderText="Price" HtmlEncode="False" SortExpression="UnitPrice" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts"
TypeName="ProductsBLL"></asp:ObjectDataSource>
Şu ana kadarki ilerleme durumumuzu bir tarayıcıda görüntülemek için biraz zaman ayırın. Şekil 2'de verileri kategoriye göre alfabetik düzende sıralandığında sıralanabilir GridView gösterilmektedir.
Şekil 2: Sıralanabilir GridView Verileri Kategoriye Göre Sıralandı (Tam boyutlu görüntüyü görüntülemek için tıklayın)
2. Adım: Ayırıcı Satır Ekleme Tekniklerini Keşfetme
Genel, sıralanabilir GridView tamamlandıktan sonra kalan tek şey, her benzersiz sıralanmış gruptan önce GridView'a ayırıcı satırları ekleyebilmektir. Ancak bu tür satırlar GridView'a nasıl eklenebilir? Temel olarak GridView satırları arasında yineleme yapmamız, sıralanmış sütundaki değerler arasındaki farkların nerede olduğunu belirlememiz ve ardından uygun ayırıcı satırını eklememiz gerekir. Bu sorunu düşünürken, çözümün GridView RowDataBound
olay işleyicisinde bir yerde olması doğal görünüyor.
Verilere Dayalı Özel Biçimlendirme öğreticisinde ele aldığımız gibi, bu olay işleyicisi genellikle satır verilerine göre satır düzeyi biçimlendirme uygulanırken kullanılır. Ancak, RowDataBound
bu olay işleyicisinden program aracılığıyla GridView'a satır eklenemediğinden, olay işleyicisi burada çözüm değildir. GridView Rows
koleksiyonu gerçekte salt okunur.
GridView'a başka satırlar eklemek için üç seçeneğimiz vardır:
- Bu meta veri ayırıcı satırlarını GridView'a bağlı gerçek verilere ekleyin
- GridView verilere bağlandıktan sonra GridView denetim koleksiyonuna ek
TableRow
örnekler ekleyin - GridView denetimini genişleten ve GridView yapısını oluşturmakla sorumlu olan yöntemleri geçersiz kılan özel bir sunucu denetimi oluşturma
Bu işlev birçok web sayfasında veya çeşitli web sitelerinde gerekliyse, özel bir sunucu denetimi oluşturmak en iyi yaklaşım olacaktır. Bununla birlikte, gridView'un iç çalışmalarının derinliklerine yönelik kapsamlı bir inceleme ve biraz kod gerektirir. Bu nedenle, zaten bu seçenek bu eğitimde dikkate alınmayacaktır.
GridView'e bağlı olan gerçek verilere ayırıcı satırlar ekleyen ve GridView'in kontrol koleksiyonunu bağlandıktan sonra manipüle eden diğer iki seçenek, soruna farklı şekillerde yaklaşır ve bir tartışmayı hak eder.
GridView'a Bağlı Verilere Satır Ekleme
GridView bir veri kaynağına bağlandığında, veri kaynağı tarafından döndürülen her kayıt için bir GridViewRow
oluşturur. Bu nedenle, GridView'a bağlamadan önce veri kaynağına ayırıcı kayıtlar ekleyerek gerekli ayırıcı satırları ekleyebiliriz. Şekil 3'de bu kavram gösterilmektedir.
Şekil 3: Bir Teknik, Veri Kaynağına Ayırıcı SatırLar Eklemeyi Içerir
Özel ayırıcı kayıt olmadığından tırnak içinde ayırıcı kayıtları terimini kullanıyorum; bunun yerine, bir şekilde veri kaynağındaki belirli bir kaydın normal veri satırı yerine ayırıcı olarak hizmet ettiğini işaretlememiz gerekir. Örneklerimizde, bir ProductsDataTable
örneğini ProductRows
tarafından oluşturulan GridView'a bağlıyoruz. Böyle bir değerin normalde mevcut olmayacağından, CategoryID
özelliğini -1
olarak ayarlayarak kaydı ayırıcı satır şeklinde işaretleyebiliriz.
Bu tekniği kullanmak için aşağıdaki adımları gerçekleştirmemiz gerekir:
- GridView'a bağlanacak verileri program aracılığıyla alma (örnek
ProductsDataTable
) - GridView s
SortExpression
veSortDirection
özelliklerine göre verileri sıralama -
ProductsRows
ProductsDataTable
içinde içinde yineleme yapın ve sıralanmış sütundaki farklılıkların nerede yer aldığına bakın - Her grup sınırında, DataTable'a bir ayırıcı kayıt
ProductsRow
örneği yerleştirin, bu örneğinCategoryID
değeri-1
olarak ayarlanmış (veya bir kaydı ayırıcı kayıt olarak işaretlemek için kararlaştırılan belirtilen değere göre). - Ayırıcı satırları ekledikten sonra, verileri program aracılığıyla GridView'a bağlayın
Bu beş adıma ek olarak GridView RowDataBound
olayı için bir olay işleyicisi de sağlamamız gerekir. Burada, her DataRow
'yi denetler ve ayarının CategoryID
-1
olduğu bir ayırıcı satır olup olmadığını belirleriz. Öyleyse, biçimlendirmesini veya hücrelerde görüntülenen metni ayarlamak isteyebiliriz.
Sıralama grubu sınırlarını eklemek için bu tekniği kullanmak, yukarıda belirtilenden biraz daha fazla çalışma gerektirir. Ayrıca GridView Sorting
olayı için bir olay işleyicisi sağlamanız ve SortExpression
ve SortDirection
değerlerini takip etmeniz gerekir.
GridView Denetim Koleksiyonunu Veriye Bağlandıktan Sonra Düzenleme
Verileri GridView'a bağlamadan önce mesajlaşmak yerine, veriler GridView'a bağlandıktan sonra ayırıcı satırları ekleyebiliriz. Veri bağlama işlemi GridView denetim hiyerarşisini oluşturur. Bu hiyerarşi gerçekte her Table
biri bir hücre koleksiyonundan oluşan bir satır koleksiyonundan oluşan bir örnektir. Özellikle, GridView'un denetim koleksiyonu kökünde bir Table
nesne, GridView'a bağlı her kayıt GridViewRow
için bir TableRow
(sınıfından DataSource
türetilir) ve TableCell
içindeki her veri alanı GridViewRow
için her DataSource
örnekte bir nesne içerir.
Her sıralama grubuna ayırıcı satır eklemek için, oluşturulduktan sonra bu kontrol hiyerarşisini doğrudan manipüle edebiliriz. Sayfa işlenirken, GridView denetim hiyerarşisinin son kez oluşturulduğundan emin olabiliriz. Bu nedenle, bu yaklaşım sınıf s Page
yöntemini geçersiz kılar Render
ve bu noktada GridView'un son denetim hiyerarşisi gerekli ayırıcı satırları içerecek şekilde güncelleştirilir. Şekil 4'de bu işlem gösterilmektedir.
Şekil 4: Alternatif Bir Teknik GridView Denetim Hiyerarşisini Denetler (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Bu öğreticide, sıralama kullanıcı deneyimini özelleştirmek için bu ikinci yaklaşımı kullanacağız.
Uyarı
Bu öğreticide sunduğum kod, Teemu Keiski'nin, GridView Sıralama ve Gruplama Üzerine Denemeler başlıklı blog girdisinde sağlanan örneği temel alır.
3. Adım: GridView Denetim Hiyerarşisine Ayırıcı Satırları Ekleme
Kılavuz Görünümü denetim hiyerarşisine yalnızca denetim hiyerarşisi oluşturulduktan ve bu sayfa ziyaretinde son kez oluşturulduktan sonra ayırıcı satırları eklemek istediğimizden, bu ekleme işlemini sayfa yaşam döngüsünün sonunda, ancak gerçek GridView denetim hiyerarşisi HTML olarak işlenmeden önce gerçekleştirmek istiyoruz. Bunu gerçekleştirebileceğimiz en son olası nokta, Page
sınıfı ve Render
olayıdır. Aşağıdaki yöntem imzasını kullanarak arka plandaki kod sınıfımızda bunları geçersiz kılabiliriz.
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
' Add code to manipulate the GridView control hierarchy
MyBase.Render(writer)
End Sub
Sınıfın Page
özgün Render
yöntemi çağrıldığında base.Render(writer)
sayfadaki denetimlerin her biri işlenir ve denetim hiyerarşisine göre işaretleme oluşturulur. Bu nedenle, hem sayfanın işlenmesi için base.Render(writer)
çağrılmasının, hem de base.Render(writer)
çağrılmadan önce GridView kontrol hiyerarşisinin işlenmesi ve böylece ayırıcı satırların GridView kontrol hiyerarşisine eklenmiş olması ve ardından işlenmesi gereklidir.
Sıralama grubu üst bilgilerini eklemek için önce kullanıcının verilerin sıralanmasını istediğinden emin olmamız gerekir. Varsayılan olarak, GridView içeriği sıralanmaz ve bu nedenle herhangi bir grup sıralama üst bilgisi girmemiz gerekmez.
Uyarı
Sayfa ilk yüklendiğinde GridView'un belirli bir sütuna göre sıralanmasını istiyorsanız, ilk sayfa ziyaretinde GridView s Sort
yöntemini çağırın (ancak sonraki geri göndermelerde çağırmayın). Bunu yapmak için, bu çağrıyı bir Page_Load
koşullu içinde if (!Page.IsPostBack)
olay işleyicisine ekleyin. Yöntem hakkında daha fazla bilgi için Sayfalama ve Rapor Verilerini Sıralama öğretici bilgilerine Sort
geri bakın.
Verilerin sıralandığını varsayarsak, sonraki görevimiz verilerin hangi sütuna göre sıralandığını belirlemek ve sonra bu sütunun değerlerindeki farkları bulmak için satırları taramaktır. Aşağıdaki kod, verilerin sıralanmasını sağlar ve verilerin sıralandığı sütunu bulur:
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
' Only add the sorting UI if the GridView is sorted
If Not String.IsNullOrEmpty(ProductList.SortExpression) Then
' Determine the index and HeaderText of the column that
'the data is sorted by
Dim sortColumnIndex As Integer = -1
Dim sortColumnHeaderText As String = String.Empty
For i As Integer = 0 To ProductList.Columns.Count - 1
If ProductList.Columns(i).SortExpression.CompareTo( _
ProductList.SortExpression) = 0 Then
sortColumnIndex = i
sortColumnHeaderText = ProductList.Columns(i).HeaderText
Exit For
End If
Next
' TODO: Scan the rows for differences in the sorted column�s values
End Sub
GridView henüz sıralanmadıysa GridView s SortExpression
özelliği ayarlanmamıştır. Bu nedenle, yalnızca bu özelliğin değeri varsa ayırıcı satırları eklemek istiyoruz. Varsa, bir sonraki adımda verilerin sıralandığı sütunun dizinini belirlememiz gerekir. Bu, GridView s Columns
koleksiyonunda döngü yaparak, özelliği GridView s SortExpression
özelliğine eşit olan SortExpression
sütunu arayarak gerçekleştirilir. Sütun dizinine ek olarak, ayırıcı satırları görüntülerken kullanılan HeaderText
özelliğini de elde ederiz.
Verilerin sıralandığı sütunun diziniyle, son adım GridView satırlarını numaralandırmaktır. Her satır için sıralanmış sütun değerinin önceki satırdaki sıralanmış sütun değerinden farklı olup olmadığını belirlememiz gerekir. Öyleyse, denetim hiyerarşisine yeni GridViewRow
bir örnek eklememiz gerekir. Bu, aşağıdaki kodla gerçekleştirilir:
Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
' Only add the sorting UI if the GridView is sorted
If Not String.IsNullOrEmpty(ProductList.SortExpression) Then
' ... Code for finding the sorted column index removed for brevity ...
' Reference the Table the GridView has been rendered into
Dim gridTable As Table = CType(ProductList.Controls(0), Table)
' Enumerate each TableRow, adding a sorting UI header if
' the sorted value has changed
Dim lastValue As String = String.Empty
For Each gvr As GridViewRow In ProductList.Rows
Dim currentValue As String = gvr.Cells(sortColumnIndex).Text
If lastValue.CompareTo(currentValue) <> 0 Then
' there's been a change in value in the sorted column
Dim rowIndex As Integer = gridTable.Rows.GetRowIndex(gvr)
' Add a new sort header row
Dim sortRow As New GridViewRow(rowIndex, rowIndex, _
DataControlRowType.DataRow, DataControlRowState.Normal)
Dim sortCell As New TableCell()
sortCell.ColumnSpan = ProductList.Columns.Count
sortCell.Text = String.Format("{0}: {1}", _
sortColumnHeaderText, currentValue)
sortCell.CssClass = "SortHeaderRowStyle"
' Add sortCell to sortRow, and sortRow to gridTable
sortRow.Cells.Add(sortCell)
gridTable.Controls.AddAt(rowIndex, sortRow)
' Update lastValue
lastValue = currentValue
End If
Next
End If
MyBase.Render(writer)
End Sub
Bu kod, GridView denetim hiyerarşisinin Table
kökünde bulunan nesneye program aracılığıyla başvurarak ve adlı lastValue
bir dize değişkeni oluşturarak başlar.
lastValue
geçerli satırın sıralanmış sütun değerini önceki satır s değeriyle karşılaştırmak için kullanılır. Ardından GridView koleksiyonu Rows
numaralandırılır ve her satır için sıralanmış sütunun değeri değişkende currentValue
depolanır.
Uyarı
Belirli bir satırdaki sıralanmış sütunun değerini belirlemek için hücre Text
özelliğini kullanıyorum. Bu, BoundFields için iyi çalışır, ancak TemplateFields, CheckBoxFields vb. için istenen şekilde çalışmaz. Kısa süre sonra alternatif GridView alanlarının nasıl hesaplanacağını inceleyeceğiz.
Ve currentValue
lastValue
değişkenleri daha sonra karşılaştırılır. Bunlar farklıysa, denetim hiyerarşisine yeni bir ayırıcı satırı eklememiz gerekir. Bu, GridViewRow
dizininin Table
nesnesinin Rows
koleksiyonundaki indeksini belirleyerek, yeni GridViewRow
ve TableCell
örnekleri oluşturarak ve ardından TableCell
ve GridViewRow
'yı denetim hiyerarşisine ekleyerek gerçekleştirilir.
GridView'in tüm genişliğine yayılacak şekilde biçimlendirilmiş ve TableCell
CSS sınıfı kullanılarak biçimlendirilmiş tek bir ayırıcı satıra sahip olduğunu ve SortHeaderRowStyle
özelliğinin hem sıralama grubu adını (Kategori gibi) hem de grup değerini (İçecekler gibi) gösterebileceği şekilde ayarlandığını unutmayın. Son olarak, lastValue
değeri currentValue
olarak güncellenir.
Sıralama grubu üst bilgi satırını SortHeaderRowStyle
biçimlendirmek için kullanılan CSS sınıfının dosyada Styles.css
belirtilmesi gerekir. Size hitap eden stil ayarlarını kullanmaktan çekinmeyin; Aşağıdakileri kullandım:
.SortHeaderRowStyle
{
background-color: #c00;
text-align: left;
font-weight: bold;
color: White;
}
Geçerli kodla, sıralama arabirimi herhangi bir BoundField'a göre sıralama yaparken sıralama grubu üst bilgileri ekler (sağlayıcıya göre sıralama yaparken ekran görüntüsü gösteren Şekil 5'e bakın). Ancak, başka bir alan türüne göre (CheckBoxField veya TemplateField gibi) sıralama yaparken, sıralama grubu üst bilgileri hiçbir yerde bulunmaz (bkz. Şekil 6).
Şekil 5: Sıralama Arabirimi, BoundFields'a Göre Sıralarken Grup Üst Bilgilerini Sıralamayı Içerir (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Şekil 6: CheckBoxField sıralanırken grup başlıkları eksik (Tam boyutlu görüntüyü görüntülemek için tıklayın)
CheckBoxField ölçütüne göre sıralama yaparken sıralama grubu üst bilgilerinin eksik olmasının nedeni, kodun şu anda her satır için sıralanmış sütunun değerini belirlemek için yalnızca TableCell
s Text
özelliğini kullanmasıdır. CheckBoxFields için TableCell
s Text
özelliği boş bir dizedir; bunun yerine, değer s TableCell
koleksiyonunda Controls
bulunan bir CheckBox Web denetimi aracılığıyla kullanılabilir.
BoundFields dışındaki alan türlerini işlemek için değişkenin atandığı currentValue
kodu genişleterek s TableCell
koleksiyonunda Controls
bir CheckBox olup olmadığını denetlememiz gerekir. "currentValue = gvr.Cells(sortColumnIndex).Text
'yi kullanmak yerine, bu kodu aşağıdakilerle değiştirin:"
Dim currentValue As String = String.Empty
If gvr.Cells(sortColumnIndex).Controls.Count > 0 Then
If TypeOf gvr.Cells(sortColumnIndex).Controls(0) Is CheckBox Then
If CType(gvr.Cells(sortColumnIndex).Controls(0), CheckBox).Checked Then
currentValue = "Yes"
Else
currentValue = "No"
End If
' ... Add other checks here if using columns with other
' Web controls in them (Calendars, DropDownLists, etc.) ...
End If
Else
currentValue = gvr.Cells(sortColumnIndex).Text
End If
Bu kod, geçerli satır için sıralanmış olan TableCell
sütununu inceleyerek Controls
koleksiyonunda kontrol olup olmadığını belirler. Varsa ve ilk denetim bir CheckBox ise, currentValue
CheckBox s Checked
özelliğine bağlı olarak değişken Evet veya Hayır olarak ayarlanır. Aksi takdirde, değer TableCell
s Text
özelliğinden alınır. Bu mantık, GridView'da mevcut olabilecek tüm TemplateField'lar için sıralamayı işlemek üzere çoğaltılabilir.
Yukarıdaki kod eklemesiyle, artık Devam Etmeyen CheckBoxField'a göre sıralama yaparken sıralama grubu üst bilgileri mevcuttur (bkz. Şekil 7).
Şekil 7: CheckBoxField Sıralanırken Grup Üst Bilgilerini Sırala Özelliği Artık Var (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Uyarı
NULL
, CategoryID
, veya SupplierID
alanları için UnitPrice
veritabanı değerlerine sahip ürünleriniz varsa, bu değerler GridView'da varsayılan olarak boş dizeler olarak görünür; bu da, NULL
değerine sahip ürünler için ayırıcı satır metninin Kategori: şeklinde okuyacağı anlamına gelir (Kategori: İçecekler gibi, Kategori'den sonra bir ad yoktur). Burada bir değerin görüntülenmesini istiyorsanız BoundFields NullDisplayText
özelliğini görüntülenmesini istediğiniz metne ayarlayabilir veya ayırıcı satır s currentValue
özelliğine atarken Render yöntemine Text
koşullu bir deyim ekleyebilirsiniz.
Özet
GridView, sıralama arabirimini özelleştirmek için birçok yerleşik seçenek içermez. Ancak, biraz düşük düzeyli kodla, daha özelleştirilmiş bir arabirim oluşturmak için GridView denetim hiyerarşisinde ince ayar yapmak mümkündür. Bu öğreticide, ayrı grupları ve bu grupların sınırlarını daha kolay tanımlayan sıralanabilir GridView için sıralama grubu ayırıcı satırının nasıl ekleneceğini gördük. Özelleştirilmiş sıralama arabirimlerine ek örnekler için Scott Guthrie'ninA Few ASP.NET 2.0 GridView Sorting Tips and Tricks blog girdisine bakın.
Mutlu Programlama!
Yazar Hakkında
Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.