1

ラベルとグリッドビューのドロップダウンをバインドする必要があります。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
4

3 に答える 3

0

これを試して

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

基本的には、データ項目から「TempId」を取得しGridView1_RowDataBound、その「TempId」をドロップダウンの選択値に割り当てるだけです。

このようなもの

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>
于 2012-10-26T11:49:04.253 に答える
0

私はまだ自分の解決策に納得していませんが、これが私がそれを行う方法だと思います...

初めてデータをロードするとき、辞書に各名前の実行日を入力します。

    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 をバインドするために使用されるテーブルとディクショナリに追加します。次に、バインド イベントで name ラベルを使用して、辞書から日付のリストを見つけます。

    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();
        }

    }

私は他のさまざまなアイデアをいじりました.1つは名前の一意のリストを持つxmlフィールドとして日付リストを返し(前の質問のように)、これを隠しフィールドに格納し、行のデータバインドイベントでデシリアライズしました.別の解決策はデータセットに2つのテーブルを生成し、関係を定義しますが、これは私が提案した方法と原理的に非常に似ており、私はこれを好むと思います...

于 2012-10-26T13:10:02.430 に答える
0

グリッドビューをバインドするときは、主キーをいくつかのテンプレート フィールド コントロールにもバインドする必要があります。作成していない場合は、隠しフィールドを追加して次のようにバインドします。

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

イベントではRowDataBound、PrimaryKey を見つけて、それを使用してドロップダウン選択値を次のように設定できます...

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;
    }

}
于 2012-10-26T12:06:43.857 に答える