【问题标题】:Binding dates to dropdownlist inside gridview将日期绑定到gridview内的下拉列表
【发布时间】:2012-10-16 16:09:48
【问题描述】:

我必须在网格视图中绑定标签和下拉菜单,DDL 包含日期时间格式的运行日期,我必须在 DDL 中显示与名称关联的所有不同日期。

  protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataTable dt = new DataTable();
        dt = Common.rundate();
        DropDownList ddl = e.Row.FindControl("DropDownList1") as DropDownList;

        ddl.DataTextField = "RunDate";
        ddl.DataValueField = "TempID";
        ddl.DataSource = dt;
        ddl.DataBind();
    }

}

Store Proc::  

    alter PROC display_rundates
@rundate datetime,@tempid int
AS
  SELECT RunDate,TempID
    FROM History_Table

ORDER BY Rundate DESC
GO

但我必须显示与每个名称相关的特定运行日期。任何帮助都可以理解。

Name   rundate
Test   datetime(DDL)
Test1   datetime

【问题讨论】:

  • 什么是 TempID?什么是名称(或者我认为是标签),你在说什么?它们之间有什么关系吗?
  • Name为模板名,tempid为表中的primarykey

标签: c# sql sql-server stored-procedures


【解决方案1】:

试试这个

ddl.SelectedValue = ((System.Data.DataRowView)(e.Row.DataItem)).Row["TempId"].ToString();

基本上只是在GridView1_RowDataBound 期间从数据项中获取“TempId”并将该“TempId”分配给下拉列表的 Selected 值。

类似的东西

void bindGrid()
{
   grid.DataSource = getRunDates();
   grid.DataBind();
}
DataTable getRunDates()
{
   DataTable dt = new DataTable();
   dt.Columns.Add("TempID");
   dt.Columns.Add("RunDate");
   dt.Rows.Add(new object[] { 1, "20-May-2012" });
   dt.Rows.Add(new object[] { 2, "21-May-2012" });
   dt.Rows.Add(new object[] { 3, "10-May-2012" });
   dt.Rows.Add(new object[] { 4, "20-May-2012" });
   return dt;
}
protected void grid_RowDataBound(object sender, GridViewRowEventArgs e)
{
   if (e.Row.RowType == DataControlRowType.DataRow)
   {
      DataTable dt = new DataTable();
      dt = getRunDates();
      DropDownList ddl = e.Row.FindControl("DropDownList1") as DropDownList;

      ddl.DataTextField = "RunDate";
      ddl.DataValueField = "TempID";
      ddl.DataSource = dt;
      ddl.DataBind();

      ddl.SelectedValue = ((System.Data.DataRowView)(e.Row.DataItem)).Row["TempId"].ToString();
    }
}

设计

<asp:GridView runat="server" ID="grid" OnRowDataBound="grid_RowDataBound" AutoGenerateColumns="false">
   <Columns>
      <asp:TemplateField HeaderText="RunDate">
         <ItemTemplate>
             <asp:DropDownList runat="server" ID="DropDownList1" />
         </ItemTemplate>
       </asp:TemplateField>
      <asp:BoundField HeaderText="TempID" DataField="TempID" />
   </Columns>
</asp:GridView>

【讨论】:

  • 我没有选择一个值,我必须根据模板名称显示运行日期
  • 我将运行日期动态绑定到下拉列表
  • 您的意思是您不是从数据库中选择template name,而是想根据template name 从下拉列表中选择项目?
  • 问题是我从表中获取模板名称和运行日期,我必须显示每个名称的具体运行日期
  • 但是在你的 SP 中你只有RunDate,TempID ??
【解决方案2】:

当你绑定gridview时,你还必须将主键绑定到一些模板字段控件,如果你还没有写,那么添加隐藏字段并按如下方式绑定它

 <ItemTemplate>
            <asp:HiddenField runat="server" ID="hiddenfield1" Value='<%# Eval("TempID") %>' />
            <asp:DropDownList runat="server" ID="ddl" />
 </ItemTemplate>

RowDataBound事件中你可以找到PrimaryKey,然后用它来设置Dropdown Selected Value如下...

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataTable dt = new DataTable();
        dt = Common.rundate();
        DropDownList ddl = e.Row.FindControl("DropDownList1") as DropDownList;

        ddl.DataTextField = "RunDate";
        ddl.DataValueField = "TempID";
        ddl.DataSource = dt;
        ddl.DataBind();

        HiddenField hdn=(HiddenField)row.Cells[cellindex].FindControl("hiddenField1");
        ddl.SelectedValue=hdn.Value;
    }

}

【讨论】:

    【解决方案3】:

    我仍然不相信我的解决方案,但我认为这就是我要解决的方法......

    第一次加载数据时,我会在字典中填写每个名称的运行日期:

        private Dictionary<string, List<DateTime>> runDates = new Dictionary<string, List<DateTime>>();
    
        private void LoadData()
        {
            DataTable table = new DataTable();
            table.Columns.Add("TempName", typeof(string));
    
            using (var connection = new SqlConnection("YourConnectionString"))
            using (var command = new SqlCommand("SELECT DISTINCT TempName, RunDate FROM History_Table;", connection))
            {
                connection.Open();
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        string tempName = reader.GetString(0);
                        if (!runDates.ContainsKey(tempName))
                        {
                            DataRow row = table.NewRow();
                            row[0] = tempName;
                            table.Rows.Add(row);
                            runDates.Add(tempName, new List<DateTime>());
                        }
                        runDates[tempName].Add(reader.GetDateTime(1));
                    }
                }
    
                GridView1.DataSource = table;
                GridView1.DataBind();
            }
        }
    

    读取每一行时,它会检查名称是否已存在,如果不存在,则将其添加到将用于绑定 GridView 和字典的表中。然后在绑定事件中使用名称标签从字典中查找日期列表:

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //Find the label with the temp name and assign it
                string tempName = (e.Row.FindControl("Label1") as Label).Value;
    
                DropDownList ddl = e.Row.FindControl("DropDownList1") as DropDownList;
    
                ddl.DataTextField = "RunDate";
                ddl.DataValueField = "TempID";
                ddl.DataSource = runDates[tempName];
                ddl.DataBind();
            }
    
        }
    

    我玩弄了各种其他想法,一个是将日期列表作为具有唯一名称列表的 xml 字段返回(很像您之前的问题),将其存储在隐藏字段中并反序列化行数据绑定事件,另一个解决的办法是在数据集中生成2张表,定义关系,但是这和我提出的方法原理上很相似,我觉得我更喜欢这个……

    【讨论】:

    • 我想保持简单,我想为此编写一个存储过程?我想检索数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多