Bildirim Temelli Parametreler (VB)Declarative Parameters (VB)

Scott Mitchell tarafındanby Scott Mitchell

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

Bu öğreticide, bir DetailsView denetiminde görüntülenecek verileri seçmek için bir parametre kümesinin sabit kodlanmış bir değere nasıl kullanılacağını göstereceğiz.In this tutorial we'll illustrate how to use a parameter set to a hard-coded value to select the data to display in a DetailsView control.

GirişIntroduction

Son öğreticide , ProductsBLL sınıfından GetProducts() yöntemini çağıran bir ObjectDataSource denetimine bağlanan GridView, DetailsView ve FormView denetimleriyle verileri görüntüleme konusunda baktık.In the last tutorial we looked at displaying data with the GridView, DetailsView, and FormView controls bound to an ObjectDataSource control that invoked the GetProducts() method from the ProductsBLL class. GetProducts() yöntemi, Northwind veritabanının Products tablosundaki tüm kayıtlarla doldurulmuş kesin türü belirtilmiş bir DataTable döndürür.The GetProducts() method returns a strongly-typed DataTable populated with all of the records from the Northwind database's Products table. ProductsBLL sınıfı ürünlerin yalnızca alt kümelerini döndürmek için ek yöntemler içerir-GetProductByProductID(productID), GetProductsByCategoryID(categoryID)ve GetProductsBySupplierID(supplierID).The ProductsBLL class contains additional methods for returning just subsets of the products - GetProductByProductID(productID), GetProductsByCategoryID(categoryID), and GetProductsBySupplierID(supplierID). Bu üç yöntem, döndürülen ürün bilgilerinin nasıl filtreleneceğini gösteren bir giriş parametresi bekler.These three methods expect an input parameter indicating how to filter the returned product information.

ObjectDataSource, giriş parametreleri bekleyen yöntemleri çağırmak için kullanılabilir, ancak bunu yapmak için bu parametrelerin değerlerinin nereden geldiği belirtilmelidir.The ObjectDataSource can be used to invoke methods that expect input parameters, but in order to do so we must specify where the values for these parameters come from. Parametre değerleri sabit kodlanmış olabilir veya: QueryString değerleri, oturum değişkenleri, sayfadaki bir Web denetiminin özellik değeri veya diğerleri dahil olmak üzere çeşitli dinamik kaynaklardan gelebilir.The parameter values can be hard-coded or can come from a variety of dynamic sources, including: querystring values, Session variables, the property value of a Web control on the page, or others.

Bu öğreticide, bir parametre kümesinin sabit kodlanmış bir değere nasıl kullanılacağını gösteren bir başlangıç hallelim.For this tutorial let's start by illustrating how to use a parameter set to a hard-coded value. Özellikle, belirli bir ürünle ilgili bilgileri görüntüleyen sayfaya bir DetailsView ekleme hakkında bilgi vereceğiz. Bu, Chef Anton 'nin Gumbo karışımı, yani 5 ProductID.Specifically, we'll look at adding a DetailsView to the page that displays information about a specific product, namely Chef Anton's Gumbo Mix, which has a ProductID of 5. Daha sonra, bir Web denetimine göre parametre değerinin nasıl ayarlanacağını öğreneceğiz.Next, we'll see how to set the parameter value based on a Web control. Özellikle, kullanıcının bir ülkede yer almasına izin vermek için bir metin kutusu kullanacağız. Bu, sonrasında söz konusu ülkede bulunan tedarikçilerin listesini görmek için bir düğmeye tıklayabilirler.In particular, we'll use a TextBox to let the user type in a country, after which they can click a Button to see the list of suppliers that reside in that country.

Sabit kodlanmış bir parametre değeri kullanmaUsing a Hard-Coded Parameter Value

İlk örnek için, BasicReporting klasöründeki DeclarativeParams.aspx sayfasına bir DetailsView denetimi ekleyerek başlayın.For the first example, start by adding a DetailsView control to the DeclarativeParams.aspx page in the BasicReporting folder. DetailsView 'un akıllı etiketinde, açılan listeden yeni veri kaynağı> <seçin ve bir ObjectDataSource eklemeyi seçin.From the DetailsView's smart tag, select <New data source> from the drop-down list and choose to add an ObjectDataSource.

Sayfaya bir ObjectDataSource eklemek Add an ObjectDataSource to the Page

Şekil 1: sayfaya bir ObjectDataSource ekleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 1: Add an ObjectDataSource to the Page (Click to view full-size image)

Bu, ObjectDataSource denetiminin veri kaynağı seçme Sihirbazı ' nı otomatik olarak başlatır.This will automatically start the ObjectDataSource control's Choose Data Source wizard. Sihirbazın ilk ekranından ProductsBLL sınıfını seçin.Select the ProductsBLL class from the first screen of the wizard.

ProductsBLL sınıfını seçin Select the ProductsBLL Class

Şekil 2: ProductsBLL sınıfını seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: Select the ProductsBLL Class (Click to view full-size image)

GetProductByProductID(productID) yöntemini kullanmak istediğimiz belirli bir ürünle ilgili bilgileri göstermek istiyoruz.Since we want to display information about a particular product we want to use the GetProductByProductID(productID) method.

GetProductByProductID (ProductID) yöntemini seçinChoose the GetProductByProductID(productID) method

Şekil 3: GetProductByProductID(productID) yöntemini seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 3: Choose the GetProductByProductID(productID) method (Click to view full-size image)

Seçtiğimiz Yöntem bir parametre içerdiğinden, sihirbazda kullanılacak değeri tanımlamanız istentiğimiz için, sihirbaza yönelik bir ekran daha vardır.Since the method we selected includes a parameter, there's one more screen for the wizard, where we're asked to define the value to be used for the parameter. Sol taraftaki listede, seçilen yöntemin tüm parametreleri gösterilir.The list on the left shows all of the parameters for the selected method. GetProductByProductID(productID) için yalnızca bir productIDvardır.For GetProductByProductID(productID) there's only one productID. Sağ tarafta seçili parametre için değeri belirtebilir.On the right we can specify the value for the selected parameter. Parametre kaynak açılan listesi, parametre değeri için çeşitli olası kaynakları numaralandırır.The parameter source drop-down list enumerates the various possible sources for the parameter value. productID parametresi için sabit kodlanmış 5 değeri belirtmek istediğimiz için, parametre kaynağını yok olarak bırakın ve DefaultValue metin kutusuna 5 girin.Since we want to specify a hard-coded value of 5 for the productID parameter, leave the Parameter source as None and enter 5 into the DefaultValue textbox.

ProductID parametresi için sabit kodlanmış bir parametre değeri olarak 5 kullanılırA Hard-Coded Parameter Value of 5 Will Be Used for the productID Parameter

Şekil 4: productID parametresi Için 5 sabit kodlanmış bir parametre değeri kullanılır (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 4: A Hard-Coded Parameter Value of 5 Will Be Used for the productID Parameter (Click to view full-size image)

Veri kaynağı Yapılandırma Sihirbazı 'nı tamamladıktan sonra, ObjectDataSource denetiminin bildirim temelli biçimlendirmesi, SelectMethod özelliğinde tanımlanan yöntemin her biri için SelectParameters koleksiyonundaki bir Parameter nesnesi içerir.After completing the Configure Data Source wizard, the ObjectDataSource control's declarative markup includes a Parameter object in the SelectParameters collection for each of the input parameters expected by the method defined in the SelectMethod property. Bu örnekte kullandığımız yöntem yalnızca tek bir giriş parametresi beklediği için parameterID, burada yalnızca bir giriş vardır.Since the method we're using in this example expects just a single input parameter, parameterID, there's only one entry here. SelectParameters koleksiyonu System.Web.UI.WebControls ad alanındaki Parameter sınıfından türetilen herhangi bir sınıfı içerebilir.The SelectParameters collection can contain any class that derives from the Parameter class in the System.Web.UI.WebControls namespace. Sabit kodlanmış parametre değerleri için temel Parameter sınıfı kullanılır, ancak diğer parametre kaynağı seçenekleri için türetilmiş bir Parameter sınıfı kullanılır; gerekirse kendi özel parametre türlerinizide oluşturabilirsiniz.For hard-coded parameter values the base Parameter class is used, but for the other parameter source options a derived Parameter class is used; you can also create your own custom parameter types, if needed.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    SelectMethod="GetProductByProductID" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:Parameter DefaultValue="5"
           Name="productID" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Note

Kendi bilgisayarınızda takip ediyorsanız, bu noktada gördüğünüz bildirime dayalı biçimlendirme InsertMethod, UpdateMethodve DeleteMethod özelliklerinin yanı sıra DeleteParametersiçin değerler içerebilir.If you're following along on your own computer the declarative markup you see at this point may include values for the InsertMethod, UpdateMethod, and DeleteMethod properties, as well as DeleteParameters. ObjectDataSource 'un veri kaynağı seçme Sihirbazı, ekleme, güncelleştirme ve silme için kullanılacak ProductBLL yöntemlerini otomatik olarak belirtir, bu nedenle açıkça silinmediğiniz takdirde yukarıdaki biçimlendirmeye dahil edilir.The ObjectDataSource's Choose Data Source wizard automatically specifies the methods from the ProductBLL to use for inserting, updating, and deleting, so unless you explicitly cleared those out, they'll be included in the markup above.

Bu sayfayı ziyaret ederken, veri Web denetimi ObjectDataSource 'un Select yöntemini çağırır. Bu, productID giriş parametresi için sabit kodlanmış 5 değerini kullanarak ProductsBLL sınıfının GetProductByProductID(productID) yöntemini çağıracaktır.When visiting this page, the data Web control will invoke the ObjectDataSource's Select method, which will call the ProductsBLL class's GetProductByProductID(productID) method using the hard-coded value of 5 for the productID input parameter. Yöntemi, Chef Anton 'nin Gumbo karışımı (ProductID 5 ile ürün) hakkında bilgi içeren, kesin olarak belirlenmiş ProductDataTable bir nesne döndürür.The method will return a strongly-typed ProductDataTable object that contains a single row with information about Chef Anton's Gumbo Mix (the product with ProductID 5).

Chef Anton 'nin Gumbo karışımı hakkında bilgi görüntülenirInformation About Chef Anton's Gumbo Mix are Displayed

Şekil 5: Chef Anton 'Nin Gumbo karışımı hakkında bilgi görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 5: Information About Chef Anton's Gumbo Mix are Displayed (Click to view full-size image)

Parametre değerini bir Web denetiminin özellik değerine ayarlamaSetting the Parameter Value to the Property Value of a Web Control

ObjectDataSource 'un parametre değerleri, sayfadaki bir Web denetiminin değerine göre de ayarlanabilir.The ObjectDataSource's parameter values can also be set based on the value of a Web control on the page. Bunu göstermek için, Kullanıcı tarafından belirtilen bir ülkede bulunan tüm tedarikçileri listeleyen bir GridView 'e sahip olalım.To illustrate this, let's have a GridView that lists all of the suppliers that are located in a country specified by the user. Bu başlatmayı başarmak için, kullanıcının bir ülke adı girebileceği sayfaya bir metin kutusu ekleyin.To accomplish this start by adding a TextBox to the page into which the user can enter a country name. Bu TextBox denetiminin ID özelliğini CountryNameolarak ayarlayın.Set this TextBox control's ID property to CountryName. Ayrıca bir düğme web denetimi de ekleyin.Also add a Button Web control.

ID adlı sayfaya bir TextBox ekleyinAdd a TextBox to the Page with ID CountryName

Şekil 6: ID CountryName ile sayfaya bir TextBox ekleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 6: Add a TextBox to the Page with ID CountryName (Click to view full-size image)

Sonra, sayfaya bir GridView ekleyin ve akıllı etiketinden yeni bir ObjectDataSource eklemek için öğesini seçin.Next, add a GridView to the page and, from the smart tag, choose to add a new ObjectDataSource. Üretici bilgilerini göstermek istediğimiz için sihirbazın ilk ekranından SuppliersBLL sınıfını seçin.Since we want to display supplier information select the SuppliersBLL class from the wizard's first screen. İkinci ekrandan GetSuppliersByCountry(country) yöntemini seçin.From the second screen, pick the GetSuppliersByCountry(country) method.

GetSuppliersByCountry (Country) yöntemini seçinChoose the GetSuppliersByCountry(country) Method

Şekil 7: GetSuppliersByCountry(country) yöntemini seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 7: Choose the GetSuppliersByCountry(country) Method (Click to view full-size image)

GetSuppliersByCountry(country) yönteminde bir giriş parametresi bulunduğundan, sihirbaz bir kez daha yeniden parametre değeri seçmeye yönelik son bir ekran içerir.Since the GetSuppliersByCountry(country) method has an input parameter, the wizard once again includes a final screen for choosing the parameter value. Bu kez, parametre kaynağını denetim olarak ayarlayın.This time, set the Parameter source to Control. Bu, ControlID açılan listesini sayfadaki denetimlerin adlarıyla dolduracaktır; listeden CountryName denetimini seçin.This will populate the ControlID drop-down list with the names of the controls on the page; select the CountryName control from the list. Sayfa ilk kez ziyaret edildiğinde CountryName metin kutusu boş olur, bu nedenle hiçbir sonuç döndürülmez ve hiçbir şey gösterilmez.When the page is first visited the CountryName TextBox will be blank, so no results are returned and nothing is displayed. Bazı sonuçları varsayılan olarak göstermek istiyorsanız, DefaultValue metin kutusunu uygun şekilde ayarlayın.If you want to display some results by default, set the DefaultValue textbox accordingly.

parametre değerini CountryName denetim değeri olarak ayarlayınSet the Parameter Value to the CountryName Control Value

Şekil 8: parametre değerini CountryName denetim değerine ayarlayın (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 8: Set the Parameter Value to the CountryName Control Value (Click to view full-size image)

ObjectDataSource 'un bildirim temelli biçimlendirmesi, standart Parameter nesnesi yerine ControlParameter kullanılarak ilk örneğimizden biraz farklılık gösterir.The ObjectDataSource's declarative markup differs slightly from our first example, using a ControlParameter instead of the standard Parameter object. ControlParameter, Web denetiminin ID belirtmek için ek özelliklere ve parametresi için kullanılacak özellik değerine sahiptir (PropertyName).A ControlParameter has additional properties to specify the ID of the Web control and the property value to use for the parameter (PropertyName). Veri kaynağı Yapılandırma Sihirbazı, bir metin kutusu için büyük olasılıkla parametre değeri için Text özelliğini kullanmak isteyeceğiz.The Configure Data Source wizard was smart enough to determine that, for a TextBox, we'll likely want to use the Text property for the parameter value. Ancak, Web denetiminden farklı bir özellik değeri kullanmak isterseniz, PropertyName değerini buradan değiştirebilir veya sihirbazdaki "Gelişmiş özellikleri göster" bağlantısına tıklayabilirsiniz.If, however, you want to use a different property value from the Web control you can change the PropertyName value here or by clicking the "Show advanced properties" link in the wizard.

<asp:ObjectDataSource ID="ObjectDataSource2" runat="server"
    SelectMethod="GetSuppliersByCountry" TypeName="SuppliersBLL">
    <SelectParameters>
        <asp:ControlParameter ControlID="CountryName"
            Name="country" PropertyName="Text"
            Type="String" />
    </SelectParameters>
</asp:ObjectDataSource>

CountryName metin kutusu boş olduğunda sayfa ilk kez ziyaret edildiğinde.When visiting the page for the first time the CountryName TextBox is empty. ObjectDataSource 'un Select yöntemi GridView tarafından hala çağrılır, ancak Nothing değeri GetSuppliersByCountry(country) yöntemine geçirilir.The ObjectDataSource's Select method is still invoked by the GridView, but a value of Nothing is passed into the GetSuppliersByCountry(country) method. TableAdapter Nothing bir veritabanı NULL değerine (DBNull.Value) dönüştürür, ancak GetSuppliersByCountry(country) yöntemi tarafından kullanılan sorgu NULL parametresi için bir @CategoryID değeri belirtildiğinde herhangi bir değer döndürmüyor şekilde yazılır.The TableAdapter converts the Nothing into a database NULL value (DBNull.Value), but the query used by the GetSuppliersByCountry(country) method is written such that it doesn't return any values when a NULL value is specified for the @CategoryID parameter. Kısacası, hiçbir üretici döndürülmez.In short, no suppliers are returned.

Ziyaretçi bir ülkeye girdiğinde ve geri göndermeye neden olacak şekilde tedarikçileri göster düğmesine tıkladıktan sonra, ObjectDataSource 'un Select yöntemi yeniden çağrılır ve bu, TextBox denetiminin Text değerini country parametresi olarak geçirerek yeniden sorgular.Once the visitor enters in a country, however, and clicks the Show Suppliers button to cause a postback, the ObjectDataSource's Select method is requeried, passing in the TextBox control's Text value as the country parameter.

Kanada 'daki bu tedarikçiler gösteriliyorThose Suppliers from Canada are Shown

Şekil 9: Kanada 'Daki tedarikçiler gösterilir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 9: Those Suppliers from Canada are Shown (Click to view full-size image)

Tüm tedarikçileri varsayılan olarak göstermeShowing All Suppliers By Default

İlk olarak sayfayı görüntülerken tedarikçilerinin hiçbirini göstermek yerine, ilk olarak Tüm tedarikçileri göstermek istiyoruz. böylece, metin kutusuna bir ülke adı girerek kullanıcının listeyi yavaşlayabilmesini sağlar.Rather than show none of the suppliers when first viewing the page we may want to show all suppliers at first, allowing the user to pare down the list by entering a country name in the TextBox. TextBox boş olduğunda, SuppliersBLL sınıfın GetSuppliersByCountry(country) yöntemi country giriş parametresi için Nothing geçirilir.When the TextBox is empty, the SuppliersBLL class's GetSuppliersByCountry(country) method is passed in Nothing for its country input parameter. Bu Nothing değer daha sonra DAL GetSupplierByCountry(country) yöntemine geçirilir ve burada, aşağıdaki sorgudaki @Country parametresi için bir veritabanı NULL değerine çevrilir:This Nothing value is then passed down into the DAL's GetSupplierByCountry(country) method, where it's translated to a database NULL value for the @Country parameter in the following query:

SELECT     SupplierID, CompanyName, Address, City, Country, Phone
FROM         Suppliers
WHERE Country = @Country

Country = NULL ifadesi her zaman, Country sütunu NULL değere sahip olan kayıtlar için de false döndürür; Bu nedenle, hiçbir kayıt döndürülmez.The expression Country = NULL always returns False, even for records whose Country column has a NULL value; therefore, no records are returned.

Ülke metin kutusu boş olduğunda Tüm tedarikçileri döndürmek IÇIN, BLL 'deki GetSuppliersByCountry(country) yöntemi, ülke parametresi Nothing ve diğer bir DEYIŞLE, dal GetSuppliersByCountry(country) yöntemini çağırmak için GetSuppliers() metodunu artırabilir.To return all suppliers when the country TextBox is empty, we can augment the GetSuppliersByCountry(country) method in the BLL to invoke the GetSuppliers() method when its country parameter is Nothing and to call the DAL's GetSuppliersByCountry(country) method otherwise. Bu, ülke belirtilmediğinde tüm tedarikçileri döndürme ve ülke parametresi dahil, tedarikçinin uygun alt kümesini döndürür.This will have the effect of returning all suppliers when no country is specified and the appropriate subset of suppliers when the country parameter is included.

SuppliersBLL sınıfındaki GetSuppliersByCountry(country) yöntemini aşağıdaki şekilde değiştirin:Change the GetSuppliersByCountry(country) method in the SuppliersBLL class to the following:

Public Function GetSuppliersByCountry(country As String) _
    As Northwind.SuppliersDataTable
    If String.IsNullOrEmpty(country) Then
        Return GetSuppliers()
    Else
        Return Adapter.GetSuppliersByCountry(country)
    End If
End Function

Bu değişiklik ile DeclarativeParams.aspx sayfası, ilk ziyaret edildiğinde (veya CountryName metin kutusu boş olduğunda) tüm tedarikçileri gösterir.With this change the DeclarativeParams.aspx page shows all of the suppliers when first visited (or whenever the CountryName TextBox is empty).

tüm tedarikçiler artık varsayılan olarak gösteriliyorAll Suppliers are Now Shown by Default

Şekil 10: tüm tedarikçiler artık varsayılan olarak gösteriliyor (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 10: All Suppliers are Now Shown by Default (Click to view full-size image)

ÖzetSummary

Yöntemleri giriş parametreleriyle birlikte kullanmak için, ObjectDataSource 'un SelectParameters koleksiyonundaki parametrelerin değerlerini belirtmemiz gerekir.In order to use methods with input parameters, we need to specify the values for the parameters in the ObjectDataSource's SelectParameters collection. Farklı parametre türleri, parametre değerinin farklı kaynaklardan elde edilebilir olmasını sağlar.Different types of parameters allow for the parameter value to be obtained from different sources. Varsayılan parametre türü, sabit kodlanmış bir değer kullanır, ancak kolayca (bir kod satırı olmadan) parametre değerleri, sayfada Web denetimlerinin QueryString, oturum değişkenleri, tanımlama bilgileri ve hatta Kullanıcı tarafından girilen değerlerden elde edilebilir.The default parameter type uses a hard-coded value, but just as easily (and without a line of code) parameter values can be obtained from the querystring, Session variables, cookies, and even user-entered values from Web controls on the page.

Bu öğreticide, bildirim temelli parametre değerlerinin nasıl kullanılacağını gösteren örnekler.The examples we looked at in this tutorial illustrated how to use declarative parameter values. Ancak, geçerli tarih ve saat gibi mevcut olmayan bir parametre kaynağı kullanmanın veya sitemizin üyeliği kullanıyorsa, ziyaretçi Kullanıcı KIMLIĞI gibi durumlar olabilir.However, there may be times when we need to use a parameter source that's not available, such as the current date and time, or, if our site was using Membership, the User ID of the visitor. Bu tür senaryolarda, temel nesnenin metodunu çağıran ObjectDataSource 'tan önce parametre değerlerini program aracılığıyla ayarlayabiliriz.For such scenarios we can set the parameter values programmatically prior to the ObjectDataSource invoking its underlying object's method. Bunu bir sonraki öğreticidenasıl gerçekleştireceğinizi öğreneceğiz.We'll see how to accomplish this in the next tutorial.

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.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğretici için müşteri adayı gözden geçireni Giesenow.Lead reviewer for this tutorial was Hilton Giesenow. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .If so, drop me a line at mitchell@4GuysFromRolla.com.