Доступ к строкам gridview после обратной передачи

Добрый день!

Мне нужно динамически загружать файлы и отображать информацию в 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();
 }

person user2944829    schedule 07.05.2014    source источник
comment
Чем вы заполняете GridView? Можете ли вы показать код для заполнения строк?   -  person Luthervd    schedule 07.05.2014
comment
в чем разница между KBFilesGridView и FilesGridView?   -  person Haseeb Asif    schedule 07.05.2014
comment
Нет разницы. Просто ошибка в тексте   -  person user2944829    schedule 07.05.2014


Ответы (2)


Попробуйте изменить Ispostback вот так.

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

(or)

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

Таким образом, если произойдет загрузка страницы, ваше условие if будет выполнено.

person gkrishy    schedule 07.05.2014

Вы можете найти раскрывающийся список и обновить его значением в событии RowDataBOund для gridview следующим образом

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();
      }
   }
 }
person Haseeb Asif    schedule 07.05.2014
comment
Спасибо, но как я могу взять выбранные значения из выпадающих списков после обратной передачи? - person user2944829; 07.05.2014
comment
да. В RemoveFileFromTable в GridView нет строк. - person user2944829; 07.05.2014