2008-10-24 36 views
5

Tôi muốn phân lớp danh sách thả xuống được xây dựng sẵn trong ASP.NET để tôi có thể thêm chức năng vào nó và sử dụng nó trong các trang của tôi. Tôi đã thử làm điều này với một UserControl nhưng thấy rằng nó không lộ DropDownList nội bộ (logic, tôi đoán). Tôi đã googled cho câu trả lời nhưng không thể tìm thấy bất cứ điều gì.Phân lớp DropDownList trong ASP.NET

Tôi đã đi xa như viết lớp thực tế, và có thể phân lớp từ DropDownList nhưng tôi không thể đăng ký tệp trong trang ASP.NET của tôi và sử dụng nó trong chế độ xem nguồn. Có lẽ tôi đang thiếu một số tài sản trong lớp học của tôi?

Bất kỳ ý tưởng nào?

+0

Bạn có thực sự cần phải mở rộng không? hoặc bạn có thể chỉ có một điều khiển người dùng với DDL trong nó và sau đó treo lên các sự kiện khác nhau (OnSelectedIndexChanged, OnDataBinding vv) bên trong điều khiển người dùng của bạn để thêm chức năng của riêng bạn khi một trong những sự kiện đó xảy ra? Bạn đang cố gắng thêm loại chức năng bổ sung nào? –

+0

Điều duy nhất tôi muốn làm với nó là thêm một thuộc tính InitialValue xác định giá trị đầu tiên luôn luôn hiện diện trong DDL. – deadtime

+0

Nó sẽ là hợp lý để chỉ lộ ra DDL như innerDropDownList hay gì đó? – deadtime

Trả lời

15

Bạn muốn mở rộng DropDownList trong Kiểm soát tùy chỉnh ... không phải trong một điều khiển người dùng.

Tạo một Dự án thư viện lớp mới có tên MyLibrary.

Thêm một lớp được gọi là MyDropDownList.cs

namespace My.Namespace.Controls 
{ 
[ToolboxData("<{0}:MyDropDownList runat=\"server\"></{0}:MyDropDownList>")] 
public class MyDropDownList: DropDownList 
{ 
    // your custom code goes here 
    // e.g. 
    protected override void RenderContents(HtmlTextWriter writer) 
    { 
     //Your own render code 
    } 
} 
} 

Khi bạn biên dịch thư viện của bạn, bạn có thể thêm một tham chiếu đến nó trong ứng dụng web của bạn.

Và một tagprefix trong web.config của bạn

<add tagPrefix="my" namespace="My.Namespace.Controls" assembly="MyLibrary" /> 

Điều đó sẽ cho phép bạn thêm video này vào aspx của bạn/ascx của

<my:MyDropDownList ID="myDDl" runat="server"> 
    ... 
</my:MyDropDownList> 
+1

+1 Đây là mô tả tuyệt vời về cách tạo các điều khiển tùy chỉnh kế thừa chức năng của chúng từ các đối tượng ASP.NET cơ bản. Rất rõ ràng và súc tích! – kdmurray

0

Trong một bình luận, bạn làm rõ mục tiêu của mình: "Các chỉ điều tôi muốn làm với nó là thêm một thuộc tính InitialValue xác định giá trị đầu tiên luôn luôn hiện diện trong DDL. "

Tôi không nghĩ bạn cần tạo điều khiển người dùng đặc biệt hoặc kiểm soát tùy chỉnh để thực hiện điều đó.

Tôi thường sử dụng mã này trong các ứng dụng web của mình để điền các điều khiển danh sách. Bạn vượt qua trong một boolean chỉ ra cho dù một ListItem bổ sung là để được thêm vào ở đầu danh sách, và các văn bản cho mục đó.

public static void BindListControl (ListControl ctl, SqlDataReader dr, 
     String textColumn, String valueColumn, bool addBlankRow, string blankRowText) 
    { 
     ctl.Items.Clear(); 
     ctl.DataSource = dr; 
     ctl.DataTextField = textColumn; 
     ctl.DataValueField = valueColumn; 
     ctl.DataBind(); 

     if (addBlankRow == true) ctl.Items.Insert(0, blankRowText); 
    } 

Điều này rất hữu ích, ví dụ nếu bạn muốn mọi DropDownList có giá trị ban đầu là trống hoặc văn bản như "Chọn thành phố".

Các vấn đề liên quan