Solved

Dim drv As DataRowView = CType(e.Item.DataItem, DataRowView) Causing errors

Posted on 2004-04-14
9
1,799 Views
Last Modified: 2007-12-19
Ive used and played around with code directly of MSDN, and I can't see why I'm getting a "Specified cast is not valid" error in my code (Marked with a '@#@ in the code below.)

My understanding of this isn't great, but I can't see where there is a problem... If someone could point this out to me I can get back to work on my dissertation! : )


.aspx code
--------------------------

<asp:datalist id="Datalist2"  RepeatColumns="1" RepeatDirection="horizontal" >
' Header template removed
' Footer template removed
<ItemTemplate>
  <TR>
    <TD><%# container.dataitem("reported_date") %></TD>
    <TD><asp:Label id=lbllink Visible="True" Runat="server"></asp:Label></TD>
    <TD><%# container.dataitem("reported_type") %></TD>
    <TD><%# container.dataitem("reported_status") %></TD>
    <TD>'Some other stuff that takes too much room an isn't important</TD>
  </TR>
</ItemTemplate>
</asp:datalist>

aspx.VB Codebehind
--------------------------------

'Databinding

        Dim SQL2 As String
        Dim dbConn As New DBConnect                                                      ' An object that controls my DB connections
        Dim dataobj2 As Object                                                                 ' Object to store the DB recordset
        SQL2 = "select * from sgallreported where reported_type = 1"         ' This gets us the Shout reports
        dataobj2 = dbConn.Bind(SQL2)                                                      ' Fills the dataobj with the database info.
        Datalist2.DataSource = dataobj2                                                    ' sets the datasource for the Datalist
        Page.DataBind()                                                                           ' Binds the data

'Problem Function
    Private Sub Datalist2_ItemDataBound(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs)    Handles Datalist2.ItemDataBound
 
       'This should allow us to format the newly databound Datalist2 (The shouts one)
       If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
         Dim drv As DataRowView = CType(e.Item.DataItem, DataRowView)    '<-- @#@ THIS IS THE PROBLEM LINE
         Dim link As Label = CType(e.Item.FindControl("lbllink"), Label)
        l ink.Text = "no"
       End If



Error Details
--------------------

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidCastException: Specified cast is not valid.

Source Error:

Line 233:        'This should allow us to format the newly databound Datalist2 (The shouts one)
Line 234:        If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
Line 235:            Dim drv As DataRowView = CType(e.Item.DataItem, DataRowView)
Line 236:            Dim link As Label = CType(e.Item.FindControl("lbllink"), Label)
 
0
Comment
Question by:Scampi
  • 4
  • 4
9 Comments
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10828643
try it as a DataRow instead of a DataRowView...

DataRowView Class
Requirements
Namespace: System.Data


Represents a customized view of a DataRow exposed as a fully featured Windows Forms control.

For a list of all members of this type, see DataRowView Members.

System.Object
0
 

Author Comment

by:Scampi
ID: 10828775
Sadly this comes back with the same error...

Is how I'm binding the data to the page causing the problems? I have seen many differnet ways other than
container.dataitem("something"), but I don't know the difference...

But then that doesn't explain why the other Casting
Dim link As Label = CType(e.Item.FindControl("lbllink"), Label)
works fine.


0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10828792
what are you binding it to ?
0
How our DevOps Teams Maximize Uptime

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us. Read the use case whitepaper.

 
LVL 37

Expert Comment

by:gregoryyoung
ID: 10828799
ah a recordset shoulda read first .... i think you would then cast it to a recordset but I have never actually tried using a recordset ...
0
 

Author Comment

by:Scampi
ID: 10828836
Gregory  - So the recordset should be read before it's bound to the DataList? I've had this datalist being populated fine with data without altering the current binding code...

For some more information, the e.Item.DataItem is a System.Data.Common.DBDataRecord - I don't know if this is what its supposed to be, but It might be helpful.
0
 

Author Comment

by:Scampi
ID: 10828861
In fact, sorry Gregory but I've just worked it out...

For public intrest, instead of trying to cast the e.item.dataitem ive used it directly, as so...

        If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
            Dim drv As System.Data.Common.DbDataRecord = e.Item.DataItem
            Dim link As Label = CType(e.Item.FindControl("lbllink"), Label)
            If drv("reported_status") = "Deleted" Then
                link.Text = "no"
            End If
        End If

0
 
LVL 37

Assisted Solution

by:gregoryyoung
gregoryyoung earned 250 total points
ID: 10829175
no I meant I should have ooked to see what was getting bound I was assuming a datatable/dataview etc ... in which case it would be a datarow ... I dont work with recordsets ... I dont know what they pass as.

In THIS case it is that ... it depends what you bind ...
0
 
LVL 10

Accepted Solution

by:
EBatista earned 250 total points
ID: 10829320
just to clarify:
DataRowView represent a row of a DataView object, so you cant convert a DataItem (actually System.Data.Common.DBDataRecord as you say) to it, that should work when you bind the control to a dataview objec:
System.Data.DataView dview=aDataTable.DefaultView
where aDataTable contains all the data retrieved by the query string you use.

regards
0
 

Author Comment

by:Scampi
ID: 10829722
Thanks for your help Greg - your prompting led me to a solution, and thanks to EBatista for the reason why it didn't work. As you see I've called it a draw and split the points. I must be going soft :)
0

Featured Post

How our DevOps Teams Maximize Uptime

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us. Read the use case whitepaper.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/A_4334-Minify-and-Concatenate-Your-Scripts-and-Stylesheets.html)…
This article describes relatively difficult and non-obvious issues that are likely to arise when creating COM class in Visual Studio and deploying it by professional MSI-authoring tools. It is assumed that the reader is already familiar with the cla…
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question