2013-10-09 3 views
7

Я хочу передать все GridView значение в другую страницу У меня есть один GridView в PatientDetails.aspx страницы и одну кнопку, как показано нижеPass ASP.Net GridView с одной страницы на другую страницу

<asp:GridView ID="gvDoctorList" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" 
    AllowPaging="True" AllowSorting="True" AutoGenerateEditButton="true" AutoGenerateSelectButton="true" 
    AutoGenerateDeleteButton="true" OnSelectedIndexChanged="gvDoctorList_SelectedIndexChanged" OnRowCommand="gvDoctorList_RowCommand"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:CheckBox runat="server" ID="chk" OnCheckedChanged="chk_CheckedChanged" AutoPostBack="true" /> 
       <asp:Label runat="server" ID="lblPID" Visible="false" Text='<%# Eval("PatientId") %>'></asp:Label> 
       <asp:Button ID="btnSelect" runat="server" Text="Select" CommandName = "Select" /> 
      </ItemTemplate> 
     </asp:TemplateField> 

     <asp:BoundField DataField="PatientId" HeaderText="PatientId" SortExpression="PatientId" /> 
     <asp:BoundField DataField="firstname" HeaderText="firstname" SortExpression="firstname" /> 
     <asp:BoundField DataField="lastname" HeaderText="lastname" SortExpression="lastname" />         
     <asp:BoundField DataField="sex" HeaderText="sex" SortExpression="sex" /> 
    </Columns> 
</asp:GridView> 
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDatabaseConnectionString %>" 
    SelectCommand="SELECT [PatientId],[firstname], [lastname], [sex] FROM [PatientDetails]"></asp:SqlDataSource> 
<asp:Button ID="btnformatric" runat="server" Text="formatric3d" OnClick="btnformatric_Click" OnCommand="btnformatric_Command" /> 

на коде из PatientDetails.aspx как ниже

protected void btnformatric_Click(object sender, EventArgs e) 
{ 
    if (gvDoctorList.SelectedRow != null) 
    { 
     Server.Transfer("Patientstaticformatrix.aspx"); 
    } 
    else 
    { 
     ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true); 
    } 
} 

Сейчас на второе название страницы Patientstaticformatrix.aspx код позади, как показано ниже

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (this.Page.PreviousPage != null) 
    { 
     GridView gvDoctorList = (GridView)this.Page.PreviousPage.FindControl("gvDoctorList"); 

     GridViewRow selectedRow = gvDoctorList.SelectedRow; 
     Response.Write("PatientId: " + selectedRow.Cells[0].Text + "<br />"); 
     Response.Write("firstname: " + selectedRow.Cells[1].Text + "<br />"); 
     Response.Write("lastname: " + selectedRow.Cells[2].Text + "<br />"); 
    } 
} 

У меня был отладка кода на второй странице .... значение для gvDoctorList равно null, а также выбранное значение ROW показывает ошибку nullreference.

Можете ли вы сообщить мне, где я ошибаюсь?

+0

почему и хотят, чтобы передать управление - более простой выбор будет доступ к данным, был связан с сеткой. – NoviceProgrammer

+0

Я хочу, чтобы значение patientid на другой странице ничего больше ... и хотите вставить выбранный пациент и изображение пациента на вторую страницу – Pratik

ответ

4

Как я уже видел ваш предыдущий вопрос, поэтому я могу предложить вам одну вещь, вместо того, чтобы держать ваше gridview в сеансе (что дорого), вы можете использовать событие RowCommand, а после здесь я не думаю, что вы необходимо установить флажок или chk_CheckedChanged, вы можете передать PatientID на следующую страницу, там вы можете написать запрос, чтобы вставить выбранные данные строки в вашу новую таблицу.

<asp:TemplateField> 
     <ItemTemplate> 
     <asp:CheckBox runat="server" ID="chk" OnCheckedChanged="chk_CheckedChanged" 
     AutoPostBack="true" /> 
     <asp:Label runat="server" ID="lblPID" Visible="false" Text='<%# Eval("PatientId") %>'> 
     </asp:Label> 
     <asp:Button ID="btnSelect" runat="server" Text="Select" CommandArgument='<%# 
     Eval("PatientId") %>' CommandName = "Select" /> 
     </ItemTemplate> 
    </asp:TemplateField> 



protected void gvDoctorList_RowCommand(object sender, GridViewCommandEventArgs e) 
     { 
      if (e.CommandName == "select") 
      { 
       int pID = Convert.ToInt32(e.CommandArgument); 
       // either put ID in session and check 
       Session["PatientID"] = Convert.ToString(pID); 
       Server.Transfer("Patientstaticformatrix.aspx"); 
      } 
     } 

На события Page_Load

protected void Page_Load(object sender, EventArgs e) 
    { 
     string pID = Convert.ToString(Session["PatientID"]); 
      if(!string.IsNullOrEmpty(pID)) 
      { 
       int patientID = Convert.ToInt32(pID); 
      //Call Stored procedure which will insert this record with this ID 
      // to another table 
      }  

    } 
+0

Я пытаюсь использовать код ur, он дает мне ошибку в строке: int pID = Convert .ToInt32 (e.CommandArgument); что строка ввода не была в правильном формате ..... что с этим делать? – Pratik

+0

Что такое тип данных PatientId? –

+0

patientid is int, а также автоинкремент в sql-сервере – Pratik

4

Попробуйте использовать переменные сеанса. Вы можете установить GridView в переменную сеанса, которая затем может быть получена позже, пока один и тот же сеанс все еще активен.

Вы можете использовать следующий код для установки переменной сеанса на вашей первой странице:

Session["gvDoctorList"] = gvDoctorList; 

А затем извлечь из переменной на второй странице:

GridView gvDoctorList = (GridView)Session["gvDoctorList"]; 

Для получения дополнительной информации о Сессии видят MSDN Session State Overview.

+0

+1 bro для простейшего возможного решения –

+0

следует установить сеанс в событии изменения флажка или где-нибудь еще? – Pratik

+0

Вы можете установить переменную сеанса, где хотите, но я бы не установил ее, пока вы ее не потребуете. Как и в вашем 'btnformatric_Click':' Session ["gvDoctorList"] = gvDoctorList; Server.Transfer ("Patientstaticformatrix.aspx"); '. Таким образом, вы не используете пространство памяти, пока не потребуете его. – Nunners

0

@Nunners ответ ownsome, но можно также попробовать с следующим образом:

на anothoer страницы события Pageload выборки сетки, как:

GridView GridView1 = (GridView)this.Page.PreviousPage.FindControl("GridView1"); 

Все методика приводится ниже:

http://www.aspsnippets.com/Articles/Pass-Selected-Row-of-ASPNet-GridView-control-to-another-Page.aspx

См. Выше документ.

+0

У меня есть ссылка, что вы предложили .... но в моем случае GridView1 называется gvDoctorList ..... поэтому я его заменил .... все еще только нулевая ссылка идет .... – Pratik

+0

@Pratik см. этот http://rajudasa.blogspot.in/2011/08/aspnet-passing-gridview-control-from.html –

+0

Я стараюсь, но он не работает для меня .... у вас есть какая-либо другая возможность? – Pratik

0

Реальный ответ в том, что вы должны создать такой же GridView на другой странице. Так 99% сайтов ASP.NET работают, поскольку в какой-то момент эта страница будет записывать/обновлять/удалять данные. Или просто используйте одну и ту же страницу - зачем переадресовывать, чтобы показывать одни и те же данные?

+0

Я хочу получить значение выбора из сетки и вставить выбранный пациент в таблицу sql .... но на другой странице .... bec. я хочу вставить изображение пациента и, конечно же, пациент – Pratik

+0

, так почему бы не сделать это на той же странице? :) –

+0

У меня есть настройка камеры на другой странице, так что причина, это невозможно на той же странице – Pratik

1

Я решил добавить второй ответ на основе правильных комментариев от Ahmed. Переменные сеанса действительно не должны содержать объем данных gridview из-за проблем с памятью.

должно работать соответствующим образом для того, что я предполагаю, что вы делаете:

По существу, когда вы выбираете строку, чтобы перейти на следующую страницу, которую вы пытаетесь извлечь данные из этой строки на новую страницу. Правильно ли это Успение? Если это так, у вас есть несколько вариантов использования.

Опять вы можете использовать переменный сеанс, чтобы хранить данные строки сразу извлеченных на первой странице:

protected void btnformatric_Click(object sender, EventArgs e) { 
    if (gvDoctorList.SelectedRow != null) { 

     GridViewRow selectedRow = gvDoctorList.SelectedRow; 

     Session["PatientId"] = selectedRow.Cells[0].Text; 
     Session["firstname"] = selectedRow.Cells[1].Text; 
     Session["lastname"] = selectedRow.Cells[2].Text; 

     Server.Transfer("Patientstaticformatrix.aspx"); 
    } else { 
     ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true); 
    } 
} 

По существу здесь вы находитесь на первой странице, и вы получите данные из строки. Вы затем сохранить эти данные в переменных сессиях, и вы можете использовать следующий для поиска данных из следующей страницы:

protected void Page_Load(object sender, EventArgs e) { 
    if (this.Page.PreviousPage != null) { 
     //Retrieve values from Session Variables 
     Response.Write("PatientId: " + Session["PatientId"].ToString() + "<br />"); 
     Response.Write("firstname: " + Session["firstname"].ToString() + "<br />"); 
     Response.Write("lastname: " + Session["lastname"].ToString() + "<br />"); 
    } 
} 

У вас также есть второй вариант использования запроса строк для передачи данных. Хотя для этого метода я считаю, вам придется изменить Server.Transfer("Patientstaticformatrix.aspx"); быть Response.Redirect("Patientstaticformatrix.aspx");

Ниже приведен пример использования Query Strings:

protected void btnformatric_Click(object sender, EventArgs e) { 
    if (gvDoctorList.SelectedRow != null) { 
     GridViewRow selectedRow = gvDoctorList.SelectedRow; 
     //Create URL with Query strings to redirect to new page 
     Response.Redirect("Patientstaticformatrix.aspx?parentid=" + selectedRow.Cells[0].Text + "&firstname=" + selectedRow.Cells[1].Text + "&lastname=" + selectedRow.Cells[2].Text); 
    } else { 
     ClientScript.RegisterStartupScript(this.GetType(), "alert", "alert('Please select a row.')", true); 
    } 
} 

И для извлечения значений из Request.QueryString объекта на второй странице.

protected void Page_Load(object sender, EventArgs e) { 
    if (this.Page.PreviousPage != null) { 
     //Retrieve values from Query Strings 
     Response.Write("PatientId: " + Request.QueryString["parentid"].ToString() + "<br />"); 
     Response.Write("firstname: " + Request.QueryString["firstname"].ToString() + "<br />"); 
     Response.Write("lastname: " + Request.QueryString["lastname"].ToString() + "<br />"); 
    } 
} 

Оба эти решения должны отвечать вашим требованиям, однако они оба немного отличаются. Решение Session Variable, вероятно, является предпочтительным методом, так как оно не позволит пользователям видеть все переданные данные (если вам нужно передать конфиденциальную информацию), где в качестве значений строки запроса будут доступны все, кто может видеть URL.

Для получения дополнительной информации о переменных Session и строки запросов см ресурсы ниже:

ASP.NET Session State Overview

Request.QueryString Collection

+0

Хорошее объяснение ... оцените вашу работу .... Большое спасибо, я получил решение – Pratik

Смежные вопросы