Как отобразить данные по дате в виде вложенного списка - PullRequest
0 голосов
/ 19 февраля 2012

У меня есть 2 вложенных списка ... каждый с различным источником данных ... я хочу иметь что-то вроде этого:

Февраль 2012

  • 10: название статьи
  • 04: название статьи

Январь 2012

  • 20: название статьи
  • 24: название статьи

Но теперь у меня есть

Февраль 2012

  • 10: название статьи

Февраль 2012

  • 04: название статьи

... и так далее ... мой код примерно такой:

<asp:ListView ID="lvMonthYear" runat="server" DataSourceID="SqlDataSource1"
    ItemPlaceholderID="PlaceHolder2" DataKeyNames="MnthYr" 
    onitemdatabound="lvMonthYear_ItemDataBound1">
    <ItemTemplate>
        <h1>
          <asp:Label ID="lblMonthYear" runat="server" Text='<%# Eval("MnthYr") %>'/> </h1>
         <asp:ListView ID="lvDayArticle" runat="server" DataKeyNames="artid" ItemPlaceholderID="PlaceHolder2" >
            <ItemTemplate>
                <li runat="server">
                    <asp:Label ID="lblDay" runat="server" Text='<%# Eval("artdate","{0:dd}") %>' />:
                    <asp:LinkButton ID="lblTitle" runat="server" Text='<%# Eval("title") %>' PostBackUrl='<%#Bind("artid","Articol.aspx?art={0}") %>'
                        CssClass="LinkButton1" />
                </li>
            </ItemTemplate>
            <LayoutTemplate>
                <ul>
                    <asp:PlaceHolder runat="server" ID="PlaceHolder2" />
                </ul>
            </LayoutTemplate>
             <EmptyDataTemplate>
                 Nu există niciun articol.<br />
             </EmptyDataTemplate>
        </asp:ListView>

    </ItemTemplate>
     <EmptyDataTemplate>
                 Nu există niciun articol.<br />
             </EmptyDataTemplate>
    <LayoutTemplate>
        <asp:PlaceHolder runat="server" ID="PlaceHolder2" />
    </LayoutTemplate>
</asp:ListView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ASConnectionString %>"
    SelectCommand="SELECT DISTINCT (DATENAME(MONTH, [artdate]) + ' ' + CONVERT (varchar, YEAR([artdate]))) AS [MnthYr] FROM as_Articles ORDER BY [MnthYr] DESC">
 </asp:SqlDataSource>

и код позади:

protected DataSet GetArticleds(string Month, string Year)
     {
         DataSet articleDataSet=new DataSet();
         ConnectionStringSettings cs;
         cs = ConfigurationManager.ConnectionStrings["ASConnectionString"];
         String connString = cs.ConnectionString;
         SqlConnection dbConnection = new SqlConnection(connString);
         string query = "SELECT [artid], [title], [artdate] FROM [as_Articles] WHERE DATENAME(MONTH,[artdate])=@strMonth AND CONVERT(VARCHAR,YEAR([artdate]))=@strYear ORDER BY [artdate] DESC";
         SqlCommand dbCommand = new SqlCommand(query, dbConnection);
         dbCommand.Parameters.Add(new SqlParameter("@strMonth", Month));
         dbCommand.Parameters.Add(new SqlParameter("@strYear", Year));
         SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(dbCommand);
         try
         {
             sqlDataAdapter.Fill(articleDataSet);
         }
         catch { }
             return articleDataSet;
     }


 protected void lvMonthYear_ItemDataBound1(object sender, ListViewItemEventArgs e)
 {
     if (e.Item.ItemType == ListViewItemType.DataItem)
     {
         ListViewDataItem currentItem = (ListViewDataItem)e.Item;
         DataKey currentDataKey = this.lvMonthYear.DataKeys[currentItem.DataItemIndex];
         ListView lvDayArticle = (ListView)currentItem.FindControl("lvDayArticle");

         string strMonthYear = Convert.ToString(currentDataKey["MnthYr"]);

         string strMonth = strMonthYear.Split(' ')[0];
         string strYear = strMonthYear.Split(' ')[1];
         lvDayArticle.DataSource = GetArticleds(strMonth, strYear);
         lvDayArticle.DataBind();

     }
 }

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Используя этот подход, вы не сможете выполнить свое требование.

Я хотел бы предоставить несколько шагов для продолжения выполнения вашего требования.

  1. Добавить DataKey как[MnthYr] для внешнего списка.Затем измените внешний запрос SELECT таким образом, чтобы вы получили все отдельные месяцы статьи, похожие на приведенный ниже запрос

    SELECT DISTINCT DATENAME (MONTH, [artdate]) + '' + CONVERT (VARCHAR, YEAR ([artdate]))) AS [MnthYr] FROM [as_Articles] ORDER BY [artdate] DESC

  2. Затем добавьте событие OnItemDataBound для внешнего ListView.Получите экземпляр внутреннего списка и значение DataKey текущего элемента внешнего списка.Используя это, вы можете написать метод получения деталей статьи, передав месяц и год.Затем привяжите внутренний просмотр списка.

Это, безусловно, выполнит требование.

1 голос
/ 21 февраля 2012
protected void lvMonthYear_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        ListViewDataItem currentItem= (ListViewDataItem)e.Item;
        DataKey currentDataKey = this.lvMonthYear.DataKeys[currentItem.DataItemIndex];
        ListView lvDayArticle = (ListView)currentItem.FindControl("lvDayArticle");
        string strMonthYear = Convert.ToString(currentDataKey["MnthYr"]);
        string strMonth = strMonthYear.Split(' ')[0];
        string strYear = strMonthYear.Split(' ')[1];
        lvDayArticle.DataSource = GetArticleds(strMonth,strYear);
        lvDayArticle.DataBind();
    }
}

protected DataSet GetArticleds(string Month, string Year)
{
    string strCommand="SELECT [artid], [title] FROM [as_Articles] WHERE DATENAME(MONTH,[artdate])=@strMonth AND YEAR([artdate])=@strYear";
    List<SqlParameter> sqlparam = new List<SqlParameter>();
    sqlparam.Add(new SqlParameter("@strMonth", SqlDbType.VarChar, 3) { Value = Month });
    sqlparam.Add(new SqlParameter("@strYear", SqlDbType.SmallInt) { Value = Year });
    SqlConnection con = new SqlConnection("ConnectionString");
    SqlCommand cmd = new SqlCommand(strCommand, con);
    cmd.Parameters.AddRange(sqlparam.ToArray());
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    using (DataSet ds = new DataSet())
    {
        da.Fill(ds);
        return ds;
    }
}

Надеюсь, вы получите его сейчас:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...