Yeah, I meant method... grr, still stuck in VB6 mode... Anyways, this
is the whole sub I'm working on:
private void test<T>(Panel targetpanel, string sQuery, string
sQueryParamName , string sParamVal, T sourcectrl) where
T:UserControl,n ew()
{
string Parameter;
conn = "Provider=Micro soft.Jet.OLEDB. 4.0;Data Source=T:\
\RFQMT\\RFQMT Test\\RFQMT Data.mdb;Jet OLEDB:Database
Password=tennis ";
OleDbConnection oleconn = new OleDbConnection (conn);
oleconn.Open();
Parameter = txtMemo.Text.To String();
OleDbCommand cmd = new OleDbCommand(sQ uery, oleconn);
cmd.CommandType = CommandType.Sto redProcedure;
cmd.Parameters. Add(new OleDbParameter( sQueryParamName ,
sParamVal));
DataTable dt = new DataTable("APs" );
OleDbDataAdapte r da = new OleDbDataAdapte r(cmd);
da.Fill(ds, "AP");
DataSource = new DataRowCollecti onSocket(ds.AP. Rows);
for (int i = 0; i < DataSource.Coun t; i++)
{
T tempctrl = new UserControl();
//ctrlAPs tempctrl = new ctrlAPs();
pnlAP.Controls. Add(tempctrl);
tempctrl.Top = i * tempctrl.Height - 2;
tempctrl.Left = 0;
foreach (Control c in ctrlAPs1.Contro ls)
{
Type ctrlType = c.GetType();
ConstructorInfo cInfo =
ctrlType.GetCon structor(Type.E mptyTypes);
Control retControl = (Control)cInfo. Invoke(null);
foreach (Binding ctrlBinding in c.DataBindings)
{
string BindingMember =
ctrlBinding.Bin dingMemberInfo. BindingMember;
string BindingField =
BindingMember.S ubstring(Bindin gMember.LastInd exOf("."));
tempctrl.Contro ls[c.Name].DataBindings.C lear();
tempctrl.Contro ls[c.Name].DataBindings.A dd(ctrlBinding. PropertyName,
DataSource[i], BindingField);
}
PropertyInfo DSource =
ctrlType.GetPro perty("DataSour ce");
if (DSource != null)
DSource.SetValu e(retControl,
DSource.GetValu e(c, null), null);
}
ctrlAPs2.Hide() ;
}
oleconn.Close() ;
}
Originally, I had the query and usercontrol information hard coded.
It was a 'continuous form' of sorts, like you'd see in an Access
form. Now I had different usercontrols that acted as different
'forms', but I didn't see any need in making one whole method per
control, which is why I'm trying to pass everything into this one.
Basically it clones the control onto a panel and rebinds the controls
in that panel to a dataset. Now like I said, I could pass in the
panel (i.e. which panel on my form I wanted the control copied to),
but the usercontrol I couldn't. That's why my question is, how to
pass in the control information like I can pass in the panel. HTH
On Aug 28, 10:07 am, "Ignacio Machin \( .NET/ C# MVP \)" <machin TA
laceupsolutions .comwrote:
Hi,
"Chris" <coz1...@gmail. comwrote in message
news:11******** ************@g4 g2000hsf.google groups.com...
Ok, so I have this sub I wrote, and I create a new instance of a
UserControl:
sub??? You mean method right? :)
ctrlAPs tempctrl = new ctrlAPs();
Now, I would like to be able to use this sub I wrote for more than one
UserControl, so I was trying to do something like this:
private void somesub(UserCon trol sourcectrl)
{
sourcectrl tempctrl = new sourcectrl();
}
But when I do that, I get the following error on compile:
"The type or namespace name 'sourcectrl' could not be found (are you
missing a using directive or an assembly reference?)"
So, I'm obviously not passing this in right. There has to be a way to
do this, as I do it with panels and other controls. Any help is
appreciated.
Why are you creating the UserControl inside the method?
What decide which UserControl to create?
How you return the new instance to the calling code?
What if you create the user control outside and pass it to the method?