回发后访问gridview行

时间:2014-05-07 11:08:08

标签: c# asp.net gridview templatefield

美好的一天!

我需要动态上传文件并在gridview中显示信息。 文件上传后,我需要在下拉列表中选择文件类型。 但是在回发后我无法访问Gridview1行,并获得选定的文件类型。回发后Gridview1.Rows.Count = 0。

是否可以从DropDownLists中获取选定的值?

<asp:GridView ID="GridView1"  runat="server" ShowHeader="False" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="FileName" />
<asp:TemplateField HeaderText="FileType">
<ItemTemplate>
<asp:DropDownList runat="server">
<asp:ListItem Value="Val1">Val1</asp:ListItem>
<asp:ListItem Value="Val2">Val2</asp:ListItem>
<asp:ListItem Value="Val3">Val3</asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField DeleteText="Remove" ShowDeleteButton="true" />
</Columns>
</asp:GridView>

<asp:FileUpload ID="FileUpload" runat="server" onchange="this.form.submit()" />

由于

在Page_Load中,在PostBack期间,GridView行为空。

protected void Page_Load(object sender, EventArgs e)
{
     RestoreForm();

     if (IsPostBack && FileUpload.HasFile)
     {
         AddRow(FileUpload.PostedFile.FileName);
     }

     FilesGridView.RowDeleting += new GridViewDeleteEventHandler(RemoveFileFromTable);
}

private void AddRow(string file)
{
     DataTable dt = (DataTable)Page.Session["Files"];
     if (dt == null)
     {
        AddDataTableToSession();
        dt = (DataTable)Page.Session["Files"];
     }
     DataRow dr = dt.NewRow();
     dr["FileName"] = file;
     dr["FileType"] = 0;
     dt.Rows.Add(dr);
     Page.Session["Files"] = dt;
     FilesGridView.DataSource = dt;
     FilesGridView.DataBind();
 }

 private void AddDataTableToSession()
 {
     DataTable dt = new DataTable("Files");
     DataColumn dc = new DataColumn("FileName", Type.GetType("System.String"));
     dt.Columns.Add(dc);
     dc = new DataColumn("FileType", Type.GetType("System.String"));
     dt.Columns.Add(dc);
     Page.Session["Files"] = dt;
 }

 private void RemoveFileFromTable(object sender, GridViewDeleteEventArgs e)
 {
     int recordToDelete = e.RowIndex;
     DataTable dt = (DataTable)Page.Session["Files"];
     int cn = dt.Rows.Count;
     dt.Rows.RemoveAt(recordToDelete);
     dt.AcceptChanges();
     Page.Session["Files"] = dt;
     FilesGridView.DataSource = dt;
     FilesGridView.DataBind();
 }

2 个答案:

答案 0 :(得分:0)

尝试像这样更改Ispostback。

   if (!IsPostBack && FileUpload.HasFile)
   {
     AddRow(FileUpload.PostedFile.FileName);
   }

(或)

   if (IsPostBack == false && FileUpload.HasFile)
   {
     AddRow(FileUpload.PostedFile.FileName);
   }

因此,如果发生页面加载,您的if条件将变为真。

答案 1 :(得分:0)

您可以找到下拉列表并使用gridview的RowDataBOund事件中的值进行更新,如下所示

protected void Page_Load(object sender, EventArgs e)
{
    //RestoreForm();

    if (IsPostBack && FileUpload.HasFile)
    {
        AddRow(FileUpload.PostedFile.FileName);
    }
    else
    {
        AddDataTableToSession();
    }

    FilesGridView.RowDeleting += new GridViewDeleteEventHandler(RemoveFileFromTable);
    FilesGridView.RowDataBound += KBFilesGridView_RowDataBound;

}

和行数据绑定将如下

    void KBFilesGridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        DropDownList ddl = e.Row.FindControl("DropDownList1") as DropDownList;
            if (ddl != null)
            {
                DataRow dr= ((DataRowView)e.Row.DataItem).Row;
                ddl.SelectedValue = dr["FileType"].ToString();
            }
    }

类似地,你可以获得删除方法的下拉值以及

private void RemoveFileFromTable(object sender, GridViewDeleteEventArgs e)
{
   if (e.Row.RowType == DataControlRowType.DataRow)
   {
      DropDownList ddl = e.Row.FindControl("DropDownList1") as DropDownList;
      if (ddl != null)
      {              
          if(ddl.SelectedValue == "someValue") doSomeThing();
      }
   }
 }