问题
I have an ASPX page (with VB Codebehind). I would like to extend the GridView class to show the header / footer when no rows are returned.
I found a C# example online (link) (source). However, I cannot convert it to VB because it uses typed events (which are not legal in VB).
I have tried several free C# to VB.NET converters online, but none have worked.
Please convert the example to VB.NET or provide an alternate method of extending the GridView class.
Notes / Difficulties:
If you get an error with
DataViewobjects, specify the type asSystem.Data.DataViewand the type comparison could be the following:If data.[GetType]() Is GetType(System.Data.DataView) ThenSince the event MustAddARow cannot have a type in VB (and
RaiseEvent eventdoesn't have a return value), how can I compare it toNothingin the functionOnMustAddARow()?
EDIT:
The following is a sample with (hopefully) relevant code to help answer the question.
namespace AlwaysShowHeaderFooter {
public delegate IEnumerable MustAddARowHandler(IEnumerable data);
public class GridViewAlwaysShow : GridView {
// Various member functions omitted //
protected IEnumerable OnMustAddARow(IEnumerable data) {
if (MustAddARow == null) {
throw new NullReferenceException("The datasource has no rows. You must handle the \"MustAddARow\" Event.");
}
return MustAddARow(data);
}
public event MustAddARowHandler MustAddARow;
}
}
回答1:
As I said in my comment the code will not convert to VB.Net "magically". It will require working thru it to get it to compile properly.
The easiest would be to compile the the C# code as a library.
- Create a new project (C# Class Library) and name it "AlwaysShowHeaderFooter"
- Move the files from App_Code over to the new project
- Add a reference to System.Web and System.Configuration
- Add a reference in your web project to either the compiled dll's of "AlwaysShowHeaderFooter", or add the project itself as a reference if you have it in the same solution.
- Switch out
<%@ Register TagPrefix="Custom" Namespace="AlwaysShowHeaderFooter" %>with<%@ Register Assembly="AlwaysShowHeaderFooter" Namespace="AlwaysShowHeaderFooter" TagPrefix="Custom" %>
Now you have split the control out to it's own project which can be referenced in any .Net project.
回答2:
Please see here.
There is no exact equivalent to this for VB.
Use a 'Sub' delegate with a 'ByRef' parameter instead.
A follow-up answer gives an example that works, but explains why it's a bad idea.
回答3:
Concerning 1, the cleanest VB way would be
If TypeOf data Is System.Data.DataView Then
回答4:
Regarding 2. I think events in VB.Net can pass ByRef parameters.
来源:https://stackoverflow.com/questions/2694095/convert-c-sharp-with-typed-events-to-vb-net