如何让gridview显示除关联数据源之外的数据?

时间:2014-02-09 13:41:45

标签: c# asp.net gridview

我有这样的gridview(AllItems):

enter image description here

从列表中提取项目设备名称,数量,日期时间,备份时间和电源: AllItems.DataSource = LST;

项目TotalWatts,Wh / Nyt,Wh / Day必须由本地整数变量提取,但是指定的数据源不包含TotalWatts的值

我该怎么办才能使我的网格视图也接受局部变量...... ??

gridview的代码:

<asp:GridView ID="AllItems" runat="server" AutoGenerateColumns="false" Height="124px" Width="191px" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Horizontal" OnDataBound="AllItems_DataBound" ShowFooter="true" FooterStyle-BackColor="Black">
                <Columns>
                    <asp:BoundField DataField="Applianc.Name" HeaderText="Appliance Name" />
                    <asp:BoundField DataField="Quantity" HeaderText="Quantity" />
                    <asp:BoundField DataField="DayTime" HeaderText="Day Time(Hrs)" />
                    <asp:BoundField DataField="BackUpTime" HeaderText="BackUp Time(Hrs)" />
                    <asp:BoundField DataField="Applianc.Power"  HeaderText="Power(Watts)" />
                   <asp:BoundField DataField="TotalWatts" HeaderText="Total Watts" />
                    <asp:BoundField DataField="HrsNight" HeaderText="Wh/Nyt" />
                    <asp:BoundField DataField="HrsDay" HeaderText="Wh/Day" />

                </Columns>
                <FooterStyle   BackColor="Black" ForeColor="White" Font-Italic="true" />
                <FooterStyle BackColor="#CCCC99" ForeColor="Black" />
                <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="Right" />
                <SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
                <SortedAscendingCellStyle BackColor="#F7F7F7" />
                <SortedAscendingHeaderStyle BackColor="#4B4B4B" />
                <SortedDescendingCellStyle BackColor="#E5E5E5" />
                <SortedDescendingHeaderStyle BackColor="#242121" />
            </asp:GridView>

按钮点击后面的代码

protected void BtnAddNext_Click(object sender, EventArgs e)
    {
        List<Entity.UserSiteLoad> LstUsl = (List<Entity.UserSiteLoad>)Session["MyApplianceList"];
        e_usl.Applianc = new Entity.Appliance();
        calcObj = new CalculatorTest();

        e_usl.IdUserSiteLoad = Guid.NewGuid().ToString();
        e_usl.IdUserHousing = "xxx";
        e_usl.IdAppliance = DDLAppName.SelectedItem.Value.ToString(); //<<------------
        e_usl.Applianc.Name = DDLAppName.SelectedItem.Text;
        e_usl.Applianc.Power = new Random().Next(20, 500);
        e_usl.Quantity = Convert.ToInt32(QtyTB.Text);
        e_usl.DayTime = Convert.ToInt32(DayTymTB.Text);
        e_usl.BackUpTime = Convert.ToInt32(BackUpTymTB.Text);
        e_usl.CreatedBy = "sana";
        e_usl.CreatedDate = DateTime.Now;
        //e_usl.CreationDate = DateTime.Now;
        e_usl.ModifiedBy = "sana";
        e_usl.ModifiedDate = DateTime.Now;
        e_usl.IsActive = true;
        e_usl.IsDeleted = false;
        if (LstUsl.Count != 0)
        {
            for (int rowIndex = 0; rowIndex < LstUsl.Count; rowIndex++)
            {
                string AppName = LstUsl[rowIndex].Applianc.Name;
                if (AppName == DDLAppName.SelectedItem.Text)
                {
                    LstUsl.Remove(LstUsl[rowIndex]);
                }

            }
        }
        if (LstUsl.Count == 0 || LstUsl.Count > 0)
        {
            LstUsl.Add(e_usl);
        }
        Session["MyApplianceList"] = LstUsl;
        currentIndex = LstUsl.Count - 1; //int variable
        TotalWatts = calcObj.GetTotalWattsOfEachAppliance(currentIndex); //int variable
        HrsNight = calcObj.GetWattsHrPerNight(currentIndex); //int variable
        HrsDay = calcObj.GetWattsHrPerDayForEachAppliance(currentIndex); //int variable

        Response.Write("List Count is: " + LstUsl.Count); //check
        AllItems.DataSource = LstUsl;
        AllItems.DataBind();
        AllItems.Visible = true;

        Session["MyApplianceList"] = LstUsl;


    }

2 个答案:

答案 0 :(得分:1)

您的列表不包含以下变量(属性/列)。

TotalWatts = calcObj.GetTotalWattsOfEachAppliance(currentIndex); //int variable
HrsNight = calcObj.GetWattsHrPerNight(currentIndex); //int variable
HrsDay = calcObj.GetWattsHrPerDayForEachAppliance(currentIndex); //int variable

您无法为属性DataField <asp:BoundField DataField="TotalWatts"/>分配公共变量值,TotalWatts应该存在于列表中(您的dataSource)。

您应该使用模板字段,如。

替换

<asp:BoundField DataField="TotalWatts" HeaderText="Total Watts" />

通过

<asp:TemplateField HeaderText="ListsID" Visible="true">
  <ItemTemplate>
    <asp:Literal ID="litListsID" runat="server" Text='<%# TotalWatts.ToString() %>'>
      </asp:Literal>
      </ItemTemplate>
    <HeaderStyle HorizontalAlign="Left" VerticalAlign="Top" />
</asp:TemplateField>

TotalWatts 应该是一个公共变量 你也可以在这里使用你的功能。

<asp:Literal ID="litListsID" runat="server" Text='<%# calcObj.GetTotalWattsOfEachAppliance(yourParameter) %>'>

答案 1 :(得分:0)

以下是一个简单的例子 希望这将完美地解决上述情况 我有一个有三个领域的产品清单。

 public class Product
 {
   public int ID { get; set; }
   public string Name { get; set; }
   public double UnitPrice { get; set; }
 }

我想在gridview中显示这三个字段,还在gridview中显示一个从列的现有列派生的额外列。即

ID , Name , UnitPrice , and DozenPrice(means UnitPrice * 12)

请参阅代码,希望任何人都可以解决他们显示派生列的问题

public partial class _Default : System.Web.UI.Page
{ 
    protected void Page_Load(object sender, EventArgs e)
    {
        fillGrid();
    }
    public class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public double UnitPrice { get; set; }
    }
    public void fillGrid()
    {
        var ListProduct = new List<Product>();
        ListProduct.Add(new Product() { ID = 1, Name = "item1", UnitPrice = 4.5 });
        ListProduct.Add(new Product() { ID = 1, Name = "item1", UnitPrice = 4.5 });
        ListProduct.Add(new Product() { ID = 1, Name = "item1", UnitPrice = 4.5 });
        ListProduct.Add(new Product() { ID = 1, Name = "item1", UnitPrice = 4.5 });
        GridView1.DataSource = ListProduct;
        GridView1.DataBind();
    }
    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {     
        int Dozen = 12;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            Product row = ((Product)e.Row.DataItem);
            double UnitPrice = row.UnitPrice;
            ((Literal)e.Row.FindControl("ltrDozenPrice")).Text = Convert.ToString(UnitPrice * Dozen);
        }
    }    
}

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" onrowdatabound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="ID" HeaderText="ID" />
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Unit Price" />
        <asp:TemplateField HeaderText="DozenPrice">
            <ItemTemplate>
                <asp:Literal ID="ltrDozenPrice"  runat="server"></asp:Literal>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>