2013-12-05 5 views
2

У меня, похоже, всегда есть проблемы с этим. У меня есть кнопка вне представления, которая вызывает функцию, которая нуждается в OrderNumber. Я получаю сообщение об ошибке,Получите значение BoundField из DetailsView

ArgumentOutOfRangeException was unhandled by user code 

в режиме отладки, или этот в браузере,

Specified argument was out of the range of valid values. 

Это, как я к нему доступ:

string sOrderNumber = (Order_DetailsView.Rows[0].Cells[0].Controls[0] as TextBox).Text; 
int orderNumber = Int32.Parse(sOrderNumber); 

Я также попробовал ((TextBox)Order_DetailsView.Rows[0].Cells[0].Controls[0]).Text и каждую комбинацию индексов в Rows[i].Cells[i].Controls[i], которую я мог понять.

Вот DetailsView:

<asp:DetailsView ID="Order_DetailsView" runat="server" AutoGenerateRows="False"> 
    <Fields> 
     <asp:BoundField DataField="OrderNumber" HeaderText="Order #" /> 
     <asp:BoundField DataField="GST" HeaderText="GST" DataFormatString="{0:c}" /> 
     <asp:BoundField DataField="Total" HeaderText="Total" DataFormatString="{0:c}" /> 
    </Fields> 
</asp:DetailsView> 

Am Я просто делаю все это не так? Я посмотрел на каждый пример, который мог найти, и мой код выглядит законным из того, что я могу сказать. Я чувствую, что должна быть какая-то простая вещь, которую я пропускаю.

+0

Где ваше текстовое поле в вашем DetailsView? – SpiderCode

+0

Да, именно поэтому я был так смущен. Нет TextBox, но все примеры, которые я нашел, использовали TextBox. Я думаю, это потому, что он был в режиме редактирования. Нет ли способа сделать это без TemplateField? – Ray

ответ

0

В вашей базе нет текстового поля. Поэтому вам нужно изменить свой код.

string sOrderNumber = Order_DetailsView.Rows[0].Cells[0].Text.ToString(); 
int orderNumber = Int32.Parse(sOrderNumber); 
+0

Cell [0] дал мне текст ярлыка, но Cell [1] дал мне значение, которое я хотел. Я попробовал это первым, но я, должно быть, ошибся. Благодаря! – Ray

2

Существует нет TextBox контроля в ваших деталях не смотреть, вы должны использовать TemplateField, как это:

<asp:DetailsView ID="Order_DetailsView" runat="server" AutoGenerateRows="False"> 
    <Fields> 
     <asp:BoundField DataField="OrderNumber" HeaderText="Order #" /> 
     <asp:TemplateField HeaderText="Order #"> 
      <ItemTemplate> 
       <asp:Label ID="LabelOrderNumber" runat="server" 
          Text='<%# Eval("OrderNumber") %>'> 
       </asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="GST" HeaderText="GST" DataFormatString="{0:c}" /> 
     <asp:BoundField DataField="Total" HeaderText="Total" DataFormatString="{0:c}" /> 
    </Fields> 
</asp:DetailsView> 

Затем вы можете использовать метод FindControl(), чтобы получить Label контроль со значением идентификатора, например:

Label theOrderNumberLabel = Order_DetailsView.FindControl("LabelOrderNumber") as Label; 

// Verify that we found the label before we try to use it 
if(theOrderNumberLabel != null) 
{ 
    string orderNumberText = theOrderNumberLabel.Text; 

    // Do something with order number here 

} 
+0

TemplateField, вероятно, сработал, но мне пришлось использовать BoundField. Это для школьного проекта. Спасибо хоть! – Ray

+0

@ 3x3is9 - рад, что вы его работали. В будущем вы можете указать свои ограничения в своем вопросе, чтобы помочь людям избежать предложения вещей, которые вы не можете использовать. Не стесняйтесь проголосовать за другие ответы, которые также полезны, даже если они не являются принятым ответом. :-) –

4

Там должно быть TemplateField, как показано ниже:

<asp:DetailsView ID="Order_DetailsView" runat="server" AutoGenerateRows="False"> 
<Fields> 
    <asp:BoundField DataField="OrderNumber" HeaderText="Order #" /> 
    <asp:BoundField DataField="GST" HeaderText="GST" DataFormatString="{0:c}" /> 
    <asp:BoundField DataField="Total" HeaderText="Total" DataFormatString="{0:c}" /> 
    <asp:TemplateField HeaderText="Order Number">     
     <ItemTemplate> 
      <asp:TextBox ID="txtOrderNo" runat="server" Text='<%# Bind("OrderNumber") %>'></asp:TextBox> 
     </ItemTemplate>      
    </asp:TemplateField> 
</Fields> 
</asp:DetailsView> 

Тогда вы могли бы получить доступ к нему так:

string sOrderNumber = ((TextBox)Order_DetailsView.Rows[0].Cells[0].FindControl("txtOrderNo")).Text; 

И для значения BoundField вы можете сделать так:

protected void Order_DetailsView_DataBound(object sender, EventArgs e) 
{ 
    string MyOrderNumber = Order_DetailsView.Rows[0].Cells[0].Text; 
} 
+2

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

0
**//This controller.cs class will make a .pdf file from the query output. Change //the values at "p" from the attributes of your database table. 
//The href tag of calling the controller class Action Export method from the //View class as a MVC design is: 
// <a href="@Url.Action("Export","tblOrder")">Print Orders</a> 
//Make sure to make the model class with crystal report design and ADO.NET //dataset. I have only include the controller class of the MVC model to 
//make it work only.** 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MvcApplicationCrystalReportRptSTP.Reports; 
using MvcApplicationCrystalReportRptSTP.Models; 
using CrystalDecisions.CrystalReports.Engine; 
using System.IO; 

namespace MvcApplicationCrystalReportRptSTP.Controllers 
{ 
    public class tblOrderController : Controller 
    { 
     private DB_JDBCLOGEntities mde = new DB_JDBCLOGEntities(); 
     // 
     // GET: /tblOrder/ 

     public ActionResult Index() 
     { 
      ViewBag.ListProducts = mde.tblOrders.ToList(); 
      return View(); 
     } 
     public ActionResult Export() 
     { 
      ReportDocument rd = new ReportDocument(); 
      rd.Load(Path.Combine(Server.MapPath("~/Reports/CrystalReporttblOrder.rpt"))); 
      rd.SetDataSource(mde.tblOrders.Select(p=> new 
      { 
      ID= p.ID, 
      Ordernum=p.Ordernum, 
      Username=p.Username, 
      Password=p.Password, 
      Price=p.Price.Value, 
      AddCart=p.AddCart.Value, 
      Image=p.Image 
      }).ToList()); 
      Response.Buffer=false; 
      Response.ClearContent(); 
      Response.ClearHeaders(); 
      Stream stream = rd.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat); 
      stream.Seek(0, SeekOrigin.Begin); 
      return File(stream,"application/pdf","tblOrder.pdf"); 
     } 
    } 
} 

Автор: Aneel Goplani. СНГ. 2002. США. Миннесотский государственный университет, Манкато.

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