Onay Kutularından Oluşan GridView Sütunu Ekleme (C#)Adding a GridView Column of Checkboxes (C#)

Scott Mitchell tarafındanby Scott Mitchell

Örnek uygulamayı indirin veya PDF 'yi indirinDownload Sample App or Download PDF

Bu öğretici, kullanıcıya GridView 'un birden çok satırını seçmenin sezgisel bir yolunu sağlamak için bir GridView denetimine onay kutularından oluşan bir sütun ekleme hakkında bakar.This tutorial looks at how to add a column of check boxes to a GridView control to provide the user with an intuitive way of selecting multiple rows of the GridView.

GirişIntroduction

Önceki öğreticide, belirli bir kaydı seçme amacıyla GridView 'a bir radyo düğmeleri sütununun nasıl ekleneceğini inceliyoruz.In the preceding tutorial we examined how to add a column of radio buttons to the GridView for the purpose of selecting a particular record. Radyo düğmelerinin bir sütunu, Kullanıcı kılavuzdan en çok bir öğe seçmeye sınırlı olduğunda uygun bir kullanıcı arabirimidir.A column of radio buttons is a suitable user interface when the user is limited to choosing at most one item from the grid. Ancak, bazen kullanıcının kılavuzdan rastgele sayıda öğe seçmesine izin vermek isteyebilirsiniz.At times, however, we may want to allow the user to pick an arbitrary number of items from the grid. Örneğin, Web tabanlı e-posta istemcileri, genellikle onay kutusu sütunuyla ileti listesini görüntüler.Web-based email clients, for example, typically display the list of messages with a column of checkboxes. Kullanıcı rastgele sayıda ileti seçebilir ve sonra e-postaları başka bir klasöre taşıma veya silme gibi bazı eylemler gerçekleştirebilir.The user can select an arbitrary number of messages and then perform some action, such as moving the emails to another folder or deleting them.

Bu öğreticide, onay kutusu sütunu eklemeyi ve geri gönderme sırasında hangi onay kutularının denetlendiğini öğreneceğiz.In this tutorial we will see how to add a column of checkboxes and how to determine what checkboxes were checked on postback. Özellikle, Web tabanlı e-posta istemcisi kullanıcı arabirimine benzer bir örnek oluşturacağız.In particular, we'll build an example that closely mimics the web-based email client user interface. Örneğimiz, her satırda onay kutusu bulunan Products veritabanı tablosundaki ürünleri listelemek için bir Sayfalanmış GridView içerir (bkz. Şekil 1).Our example will include a paged GridView listing the products in the Products database table with a checkbox in each row (see Figure 1). Seçili ürünleri Sil düğmesi tıklandığında seçili olan ürünler silinir.A Delete Selected Products button, when clicked, will delete those products selected.

Her ürün satırına onay kutusu dahildirEach Product Row Includes a Checkbox

Şekil 1: her ürün satırında bir onay kutusu bulunur (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 1: Each Product Row Includes a Checkbox (Click to view full-size image)

1. Adım: ürün bilgilerini listeleyen bir sayfalama GridView eklemeStep 1: Adding a Paged GridView that Lists Product Information

Onay kutularının bir sütununu ekleme konusunda kaygılanmadan önce, ilk olarak sayfalama 'yi destekleyen bir GridView 'da ürünlerin listelenmesine odaklanın.Before we worry about adding a column of checkboxes, let s first focus on listing the products in a GridView that supports paging. EnhancedGridView klasöründeki CheckBoxField.aspx sayfasını açıp araç kutusundan bir GridView sürükleyip ID Productsolarak ayarlayarak başlayın.Start by opening the CheckBoxField.aspx page in the EnhancedGridView folder and drag a GridView from the Toolbox onto the Designer, setting its ID to Products. Sonra, GridView öğesini ProductsDataSourceadlı yeni bir ObjectDataSource 'a bağlamayı seçin.Next, choose to bind the GridView to a new ObjectDataSource named ProductsDataSource. ObjectDataSource 'u, verileri döndürmek için GetProducts() metodunu çağırarak ProductsBLL sınıfını kullanacak şekilde yapılandırın.Configure the ObjectDataSource to use the ProductsBLL class, calling the GetProducts() method to return the data. Bu GridView salt okunurdur, GÜNCELLEŞTIRME, ekleme ve SILME sekmelerinden açılan listeleri (hiçbiri) ayarlayın.Since this GridView will be read-only, set the drop-down lists in the UPDATE, INSERT, and DELETE tabs to (None) .

ProductsDataSource adlı yeni bir ObjectDataSource oluşturmaCreate a New ObjectDataSource Named ProductsDataSource

Şekil 2: ProductsDataSource adlı yeni bir ObjectDataSource oluşturun (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: Create a New ObjectDataSource Named ProductsDataSource (Click to view full-size image)

GetProducts () yöntemini kullanarak verileri almak için ObjectDataSource 'ı yapılandırma Configure the ObjectDataSource to Retrieve Data Using the GetProducts() Method

Şekil 3: GetProducts() metodunu kullanarak verileri almak için ObjectDataSource 'ı yapılandırma (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 3: Configure the ObjectDataSource to Retrieve Data Using the GetProducts() Method (Click to view full-size image)

GÜNCELLEŞTIRME, ekleme ve SILME sekmelerindeki açılan listeleri (hiçbiri) ayarlaSet the Drop-Down Lists in the UPDATE, INSERT, and DELETE Tabs to (None)

Şekil 4: GÜNCELLEŞTIRME, ekleme ve silme sekmelerinden açılan listeleri (yok) ayarlayın (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 4: Set the Drop-Down Lists in the UPDATE, INSERT, and DELETE Tabs to (None) (Click to view full-size image)

Veri kaynağı Yapılandırma Sihirbazı 'nı tamamladıktan sonra, Visual Studio, ürünle ilgili veri alanları için otomatik olarak BoundColumns ve bir CheckBoxColumn oluşturur.After completing the Configure Data Source wizard, Visual Studio will automatically create BoundColumns and a CheckBoxColumn for the product-related data fields. Önceki öğreticide yaptığımız gibi, ProductName, CategoryNameve UnitPrice BoundFields alanlarını kaldırın ve HeaderText özelliklerini ürün, kategori ve fiyat olarak değiştirin.Like we did in the previous tutorial, remove all but the ProductName, CategoryName, and UnitPrice BoundFields, and change the HeaderText properties to Product, Category, and Price. UnitPrice BoundField değerini, değeri bir para birimi olarak biçimlendirilecek şekilde yapılandırın.Configure the UnitPrice BoundField so that its value is formatted as a currency. Ayrıca, GridView 'ı akıllı etiketten sayfalama etkinleştir onay kutusunu işaretleyerek sayfalamayı destekleyecek şekilde yapılandırın.Also configure the GridView to support paging by checking the Enable Paging checkbox from the smart tag.

Ayrıca, seçili ürünleri silmek için Kullanıcı arabirimini de ekleyelim.Let s also add the user interface for deleting the selected products. GridView 'un altına bir düğme web denetimi ekleyin, ID seçili ürünleri silmek için DeleteSelectedProducts ve Text özelliğini olarak ayarlayarak.Add a Button Web control beneath the GridView, setting its ID to DeleteSelectedProducts and its Text property to Delete Selected Products. Gerçekten veritabanındaki ürünleri silmek yerine, bu örnekte yalnızca silinecek ürünleri belirten bir ileti görüntüleriz.Rather than actually deleting products from the database, for this example we'll just display a message stating the products that would have been deleted. Buna uyum sağlamak için düğmenin altına bir etiket Web denetimi ekleyin.To accommodate this, add a Label Web control beneath the Button. KIMLIĞINI DeleteResultsolarak ayarlayın, Text özelliğini temizleyin ve Visible ve EnableViewState özelliklerini falseolarak ayarlayın.Set its ID to DeleteResults, clear out its Text property, and set its Visible and EnableViewState properties to false.

Bu değişiklikleri yaptıktan sonra GridView, ObjectDataSource, düğme ve etiket bildirim temelli biçimlendirme, aşağıdakine benzer olmalıdır:After making these changes, the GridView, ObjectDataSource, Button, and Label s declarative markup should similar to the following:

<p>
    <asp:GridView ID="Products" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="ProductID" DataSourceID="ProductsDataSource" 
        AllowPaging="True" EnableViewState="False">
        <Columns>
            <asp:BoundField DataField="ProductName" HeaderText="Product" 
                SortExpression="ProductName" />
            <asp:BoundField DataField="CategoryName" HeaderText="Category" 
                ReadOnly="True" SortExpression="CategoryName" />
            <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" 
                HeaderText="Price" HtmlEncode="False" 
                SortExpression="UnitPrice" />
        </Columns>
    </asp:GridView>
    <asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
        OldValuesParameterFormatString="original_{0}" 
        SelectMethod="GetProducts" TypeName="ProductsBLL">            
    </asp:ObjectDataSource>
</p>
<p>
    <asp:Button ID="DeleteSelectedProducts" runat="server" 
        Text="Delete Selected Products" />
</p>
<p>
    <asp:Label ID="DeleteResults" runat="server" EnableViewState="False" 
        Visible="False"></asp:Label>
</p>

Sayfayı tarayıcıda görüntülemek için bir dakikanızı ayırın (bkz. Şekil 5).Take a moment to view the page in a browser (see Figure 5). Bu noktada, ilk on ürünün adını, kategorisini ve fiyatını görmeniz gerekir.At this point you should see the name, category, and price of the first ten products.

Ilk on ürünün adı, kategorisi ve fiyatı listelenmiştirThe Name, Category, and Price of the First Ten Products are Listed

Şekil 5: Ilk on ürünün adı, kategorisi ve fiyatı listelenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 5: The Name, Category, and Price of the First Ten Products are Listed (Click to view full-size image)

2. Adım: onay kutularının bir sütununu eklemeStep 2: Adding a Column of Checkboxes

ASP.NET 2,0 bir CheckBoxField içerdiğinden, bir GridView öğesine CheckBox sütunu eklemek için kullanılabileceğini düşünebilir.Since ASP.NET 2.0 includes a CheckBoxField, one might think that it could be used to add a column of checkboxes to a GridView. Ne yazık ki, CheckBoxField bir Boolean veri alanıyla çalışacak şekilde tasarlandığından, bu durum değildir.Unfortunately, that is not the case, as the CheckBoxField is designed to work with a Boolean data field. Diğer bir deyişle, CheckBoxField ' ı kullanmak için, işlenmiş onay kutusunun işaretli olup olmadığını belirlemek için değeri bulunan temel alınan veri alanını belirtmemiz gerekir.That is, in order to use the CheckBoxField we must specify the underlying data field whose value is consulted to determine whether the rendered checkbox is checked. CheckBoxField 'ı yalnızca Denetlenmemiş onay kutularının bir sütununu içerecek şekilde kullanmıyoruz.We cannot use the CheckBoxField to just include a column of unchecked checkboxes.

Bunun yerine, bir TemplateField eklemesi ve ItemTemplateonay kutusu Web denetimi eklemeniz gerekir.Instead, we must add a TemplateField and add a CheckBox Web control to its ItemTemplate. Devam edin ve Products GridView 'a bir TemplateField ekleyin ve ilk (en soldaki) alanı yapın.Go ahead and add a TemplateField to the Products GridView and make it the first (far-left) field. GridView s akıllı etiketinde, şablonları düzenle bağlantısına tıklayın ve ardından araç kutusu Web denetimi ' nden ItemTemplatesürükleyin.From the GridView s smart tag, click on the Edit Templates link and then drag a CheckBox Web control from the Toolbox into the ItemTemplate. Bu CheckBox s ID özelliğini ProductSelectorolarak ayarlayın.Set this CheckBox s ID property to ProductSelector.

TemplateField s ItemTemplate 'e ProductSelector adlı bir CheckBox Web denetimi ekleyinAdd a CheckBox Web Control Named ProductSelector to the TemplateField s ItemTemplate

Şekil 6: TemplateField s ItemTemplate ProductSelector adlı CheckBox Web denetimi ekleme (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 6: Add a CheckBox Web Control Named ProductSelector to the TemplateField s ItemTemplate (Click to view full-size image)

TemplateField ve CheckBox Web denetimi eklendiğinde, her satır artık bir onay kutusu içerir.With the TemplateField and CheckBox Web control added, each row now includes a checkbox. Şekil 7 ' de, TemplateField ve onay kutusu eklendikten sonra bir tarayıcıdan görüntülendiklerinde Bu sayfa gösterilir.Figure 7 shows this page, when viewed through a browser, after the TemplateField and CheckBox have been added.

her ürün satırına artık bir onay kutusu dahildirEach Product Row Now Includes a Checkbox

Şekil 7: her ürün satırı artık bir onay kutusu içerir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 7: Each Product Row Now Includes a Checkbox (Click to view full-size image)

3. Adım: geri göndermede hangi onay kutularının denetlendiğini belirlemeStep 3: Determining What Checkboxes Were Checked On Postback

Bu noktada, bir onay kutusu sütunudur, ancak geri göndermede hangi onay kutularının denetleneceğini belirlemenin bir yolu yoktur.At this point we have a column of checkboxes but no way to determine what checkboxes were checked on postback. Seçili ürünleri Sil düğmesine tıklandığında, bu ürünleri silmek için hangi onay kutularının denetlendiğini bilmeniz gerekir.When the Delete Selected Products button is clicked, though, we need to know what checkboxes were checked in order to delete those products.

GridView s Rows özelliği , GridView 'daki veri satırlarına erişim sağlar.The GridView s Rows property provides access to the data rows in the GridView. Bu satırlarda yineleyebilir, CheckBox denetimine programlı bir şekilde erişebilir ve sonra onay kutusunun seçili olup olmadığını anlamak için Checked özelliğine başvurabilirsiniz.We can iterate through these rows, programmatically access the CheckBox control, and then consult its Checked property to determine whether the CheckBox has been selected.

DeleteSelectedProducts Button Web Control s Click olayı için bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:Create an event handler for the DeleteSelectedProducts Button Web control s Click event and add the following code:

protected void DeleteSelectedProducts_Click(object sender, EventArgs e)
{
    bool atLeastOneRowDeleted = false;
    // Iterate through the Products.Rows property
    foreach (GridViewRow row in Products.Rows)
    {
        // Access the CheckBox
        CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
        if (cb != null && cb.Checked)
        {
            // Delete row! (Well, not really...)
            atLeastOneRowDeleted = true;
            // First, get the ProductID for the selected row
            int productID = 
                Convert.ToInt32(Products.DataKeys[row.RowIndex].Value);
            // "Delete" the row
            DeleteResults.Text += string.Format(
                "This would have deleted ProductID {0}<br />", productID);
        }
    }
    // Show the Label if at least one row was deleted...
    DeleteResults.Visible = atLeastOneRowDeleted;
}

Rows özelliği, GridView s veri satırlarını oluşturan GridViewRow örneklerinin bir koleksiyonunu döndürür.The Rows property returns a collection of GridViewRow instances that makeup the GridView s data rows. Buradaki foreach döngüsü bu koleksiyonu numaralandırır.The foreach loop here enumerates this collection. Her GridViewRow nesnesi için, satır s onay kutusuna row.FindControl("controlID")kullanılarak programlı bir şekilde erişilir.For each GridViewRow object, the row s CheckBox is programmatically accessed using row.FindControl("controlID"). Onay kutusu işaretliyse, satır s karşılık gelen ProductID değeri DataKeys koleksiyonundan alınır.If the CheckBox is checked, the row s corresponding ProductID value is retrieved from the DataKeys collection. Bu alıştırmada, DeleteResults etiketinde bilgilendirici bir ileti görüntüyoruz, bunun yerine, çalışan bir uygulamada, ProductsBLL sınıf s DeleteProduct(productID) yöntemine çağrı yapacağız.In this exercise, we simply display an informative message in the DeleteResults Label, although in a working application we d instead make a call to the ProductsBLL class s DeleteProduct(productID) method.

Bu olay işleyicisinin eklenmesiyle, seçili ürünleri Sil düğmesine tıklamak artık seçili ürünlerin ProductID s ' ini gösterir.With the addition of this event handler, clicking the Delete Selected Products button now displays the ProductID s of the selected products.

Seçilen ürünleri Sil düğmesine tıklandığında seçilen ürünlere tıklandıWhen the Delete Selected Products Button is Clicked the Selected Products ProductIDs are Listed

Şekil 8: Seçili ürünleri Sil düğmesine tıklandığında seçili ürünler ProductID s listelenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 8: When the Delete Selected Products Button is Clicked the Selected Products ProductID s are Listed (Click to view full-size image)

4. Adım: tümünü Işaretle ve tüm düğmelerin Işaretini kaldırStep 4: Adding Check All and Uncheck All Buttons

Bir Kullanıcı geçerli sayfadaki tüm ürünleri silmek isterse on onay kutularından her birini denetmaları gerekir.If a user wants to delete all products on the current page, they must check each of the ten checkboxes. Tıklandığı zaman kılavuzdaki tüm onay kutularını seçen bir tümünü Işaretle düğmesi ekleyerek bu işlemin hızlandırıyoruz.We can help expedite this process by adding a Check All button that, when clicked, selects all of the checkboxes in the grid. Tüm Seçimleri Kaldır düğmesi eşit bir şekilde yararlı olacaktır.An Uncheck All button would be equally helpful.

Sayfaya iki düğme web denetimi ekleyin, GridView 'un üzerine yerleştirebilirsiniz.Add two Button Web controls to the page, placing them above the GridView. İlk tek s ID CheckAll ve Text özelliğini tümünü denetlemek için ayarlayın; ikinci bir s ID UncheckAll ve Text özelliğini tüm seçimini kaldırmak için ayarlayın.Set the first one s ID to CheckAll and its Text property to Check All ; set the second one s ID to UncheckAll and its Text property to Uncheck All .

<asp:Button ID="CheckAll" runat="server" Text="Check All" />
 
<asp:Button ID="UncheckAll" runat="server" Text="Uncheck All" />

Sonra, çağrıldığında ToggleCheckState(checkState) adlı arka plan kod sınıfında bir yöntem oluşturun, Products GridView s Rows koleksiyonunu numaralandırır ve her CheckBox s Checked özelliğini geçirilen CheckState parametresinin değerine ayarlar.Next, create a method in the code-behind class named ToggleCheckState(checkState) that, when invoked, enumerates the Products GridView s Rows collection and sets each CheckBox s Checked property to the value of the passed in checkState parameter.

private void ToggleCheckState(bool checkState)
{
    // Iterate through the Products.Rows property
    foreach (GridViewRow row in Products.Rows)
    {
        // Access the CheckBox
        CheckBox cb = (CheckBox)row.FindControl("ProductSelector");
        if (cb != null)
            cb.Checked = checkState;
    }
}

Sonra, CheckAll ve UncheckAll düğmeleri için Click olay işleyicileri oluşturun.Next, create Click event handlers for the CheckAll and UncheckAll buttons. CheckAll s olay işleyicisinde, yalnızca ToggleCheckState(true)çağırın; UncheckAll' de, ToggleCheckState(false)çağırın.In CheckAll s event handler, simply call ToggleCheckState(true); in UncheckAll, call ToggleCheckState(false).

protected void CheckAll_Click(object sender, EventArgs e)
{
    ToggleCheckState(true);
}
protected void UncheckAll_Click(object sender, EventArgs e)
{
    ToggleCheckState(false);
}

Bu kodla, tümünü Işaretle düğmesine tıklamak geri göndermeye neden olur ve GridView 'daki tüm onay kutularını kontrol eder.With this code, clicking the Check All button causes a postback and checks all of the checkboxes in the GridView. Benzer şekilde, Işaretini Kaldır ' a tıklamak tüm onay kutularının seçimini kaldırır.Likewise, clicking Uncheck All unselects all checkboxes. Şekil 9, tümünü denetle düğmesi işaretli olduktan sonra ekranı gösterir.Figure 9 shows the screen after the Check All button has been checked.

Tümünü denetle düğmesine tıklamak tüm onay kutularını seçerClicking the Check All Button Selects All Checkboxes

Şekil 9: Tümünü işaretle düğmesine tıklamak tüm onay kutularını seçer (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 9: Clicking the Check All Button Selects All Checkboxes (Click to view full-size image)

Note

CheckBox sütununun bir sütununu görüntülerken, tüm onay kutularını seçmek veya seçmek için bir yaklaşım, üst bilgi satırındaki bir onay kutusu aracılığıyla yapılır.When displaying a column of checkboxes, one approach for selecting or unselecting all of the checkboxes is through a checkbox in the header row. Üstelik, tüm uygulama için geçerli denetim/onay Işareti geri gönderme gerektirir.Moreover, the current Check All / Uncheck All implementation requires a postback. Onay kutuları, tam olarak istemci tarafı komut dosyası aracılığıyla denetlenebilir veya işaretlenmemiş olabilir, böylece bir snappier Kullanıcı deneyimi sağlar.The checkboxes can be checked or unchecked, however, entirely through client-side script, thereby providing a snappier user experience. Bir başlık satırı onay kutusunu tümünü Işaretle ve tüm ayrıntıları kaldır seçeneklerinin yanı sıra, istemci tarafı teknikleriyle ilgili bir tartışmayla birlikte, istemci tarafı komut dosyası ve tümünü denetle onay kutularını kullanarak bir GridView 'Daki tüm onay kutularınıkontrol edin.To explore using a header row checkbox for Check All and Uncheck All in detail, along with a discussion on using client-side techniques, check out Checking All CheckBoxes in a GridView Using Client-Side Script and a Check All CheckBox.

ÖzetSummary

Kullanıcıların devam etmeden önce GridView 'dan rastgele sayıda satır seçmesini sağlamak zorunda olduğu durumlarda, onay kutularının bir sütununu eklemek tek seçenektir.In cases where you need to let users choose an arbitrary number of rows from a GridView before proceeding, adding a column of checkboxes is one option. Bu öğreticide gördüğünüz gibi, GridView içindeki onay kutuları sütununu da içeren bir CheckBox Web denetimiyle TemplateField eklenmesi gerekir.As we saw in this tutorial, including a column of checkboxes in the GridView entails adding a TemplateField with a CheckBox Web control. Bir Web denetimi kullanarak (önceki öğreticide yaptığımız gibi, doğrudan şablonda ekleme biçimlendirme), ASP.NET hangi onay kutularının olduğunu ve geri gönderme sırasında denetlenmediğini otomatik olarak anımsar.By using a Web control (versus injecting markup directly into the template, as we did in the previous tutorial) ASP.NET automatically remembers what CheckBoxes were and were not checked across postback. Ayrıca, belirli bir onay kutusunun işaretli olup olmadığını ve denetlenen durumu değiştirmeyi öğrenmek için koddaki onay kutularına programlı bir şekilde erişebilirler.We can also programmatically access the CheckBoxes in code to determine whether a given CheckBox is checked, or to change the checked state.

Bu öğretici ve en son bir satır seçici sütununu GridView 'a eklemeyi incelemiştir.This tutorial and the last one looked at adding a row selector column to the GridView. Bir sonraki öğreticimizde GridView 'a ekleme özelliği ekleyebilmemiz için bir iş sayesinde nasıl bir iş olduğunu inceleyeceğiz.In our next tutorial we'll examine how, with a bit of work, we can add inserting capabilities to the GridView.

Programlamanın kutlu olsun!Happy Programming!

Yazar hakkındaAbout the Author

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.comadresinden erişilebilir .He can be reached at mitchell@4GuysFromRolla.com. ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.or via his blog, which can be found at http://ScottOnWriting.NET.