0

私がやろうとしているのは、基本的にこの写真が示すものです。 代替テキスト

ツリービューから何かを選択すると、データベースからいくつかのデータを選択する linq コマンドにパラメーターが渡されます。選択範囲内のすべてのアイテムに対して、アイテムがフォルダーかファイルかを表すアイコンとテキストを作成したいと考えています。アイコンまたはリンクをプッシュすると、ツリービューをプッシュするのと同じようにして、データベースから再度選択してプレースホルダーにデータを入力する linq コマンドにパラメーターを渡します。

私が今これを行っている方法は、runtima で ImageButton と LinkBut​​ton を保持する Panel を作成することです。次に、Panel を ContentPlaceHolder に追加します。これに伴う問題は、何か新しいものを選択するたびに実行され、ツリービューからのみアイコンまたはリンクボタンを押すと機能しなくなります。

コントローラーと css を使用して、アイコンのこの外観を取得できますか? 別のより良い方法はありますか?

これは基本的に、Windows で Explorer が使用するシステムと同じシステムです。Treeview にはフォルダのみが表示されますが、ウィンドウにはフォルダとファイルが表示されます。フォルダをクリックすると、そのフォルダが開き、メイン ウィンドウにそのフォルダ内のアイテムが表示されます。ファイルをクリックすると、エディターが開き、ファイルの内容が表示されます。

4

2 に答える 2

2

あなたの質問を100%理解しているかどうかはわかりませんが、要点はわかったと思います。

最初にフォルダーが必要で、次にファイルが必要であると想定しています。この領域に 2 つのリピーターを作成します。1 つはフォルダー イメージとリンク ボタンを保持するため、もう 1 つはファイル イメージとリンク ボタンを保持するためです。

linq コマンドを 2 つのクエリに分割します。1 つはフォルダーを取得するためのもので、もう 1 つはファイルを取得するためのものです。次に、リピーターを対応するリピーターにバインドします。

開始するためのコードを次に示します。

<asp:Repeater ID="rptFolders" runat="server" OnItemCommand="rptFolders_ItemDataBound">
    <ItemTemplate>
        <div>
            <asp:ImageButton ID="btnImage" runat="server" />
            <asp:LinkButton ID="btnLink" runat="server" />
        </div>
    </ItemTemplate>
</asp:Repeater>

そして、呼び出し後のコードビハインドDataBind():

protected void rptFolders_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Book book = (Book)e.Item.DataItem; //Or whatever your passing

        ImageButton btnImage = e.Item.FindControl("btnImage");
        LinkButton btnLink = e.Item.FindControl("btnLink");

        btnLink.Text = book.Name;

        btnLink.Click += new EventHandler(FolderClicked);
        btnImage.Click += new ImageClickEventHandler(FolderClicked);
    }
}

明らかに、クリック イベントを使ってやりたいことが何でもできます。適切な測定のためにそれらを追加しただけです。

おそらく、フォルダーとファイル コントロールを作成し、イメージ ボタンとリンク ボタンの組み合わせの代わりにそれらを使用します。このようにして、ID を取得するために別のクエリを実行する必要なく、後でアクセスするためにフォルダー/ファイルに関するより多くの情報を保存できます。しかし、これには何百万ものアプローチがあります。あなたが最良だと思うものを選んでください.

この解決策についてさらにガイダンスが必要な場合、または質問が理解できなかった場合はお知らせください。

ハッピーコーディング...

于 2010-07-21T18:55:54.757 に答える
1

申し訳ありませんが、別の回答として追加する必要がありました。フォルダー ユーザー コントロールの簡単なサンプルを次に示します。

あなたのコントロールを作成してください...フォーマットは好きなようにします。

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="FolderButton.ascx.cs" Inherits="FolderButton" %>
<div>
    <asp:ImageButton ID="btnImage" runat="server" ImageUrl="yourfolder.jpg" />
    <asp:LinkButton ID="btnTitle" runat="server" />
</div>

プロパティとクリック イベントをコード ビハインドに追加します (画像とリンク ボタンがクリックされたときにクリック イベントを発生させることを忘れないでください)。

public partial class FolderButton : System.Web.UI.UserControl
{
    public int DatabaseId { get; set; }
    public string Name { get; set;}  // you can even set your linkbutton text here. 

    public event EventHandler Click;
}

FolderButton コントロールのリピーターを作成します。

 <asp:Repeater ID="rptFolders" runat="server" OnItemDataBound="rptFolders_ItemDataBound">
            <ItemTemplate>
                <uc1:FolderButton ID="FolderButton1" runat="server" />
            </ItemTemplate>
        </asp:Repeater>

DataBinding にフォルダー ID を設定します。

protected void rptFolders_ItemDataBound(object sender, RepeaterItemEventArgs e)        
{        
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)        
    {        
        Book book = (Book)e.Item.DataItem; //Or whatever your passing        

        FolderButton btnFolder = e.Item.FindControls("FolderButton1");

        btnFolder.Name=book.Name;
        btnFolder.DatabaseId=book.Id;

        btnFolder.Click += new EventHandler(FolderClicked);        
    }        
}     

最後に、イベントをクリックして好きなことをすることができます:

     void FolderClicked(object sender, EventArgs e)
{
     int id = ((FolderButton)sender).DatabaseId;

     /// Do something with your Id
}

不明な点があればお知らせください。これはフリーハンドの簡単なサンプルなので、タイプミスや悪い慣行を許してください...コードはデモストレーションのみを目的としています。

于 2010-07-22T15:10:03.763 に答える