Marc,
My guess is you're using the other binding syntax (there two different binding syntax you can use for databinding). Not a big deal, just need to look at it differently. See my blog post about this:
http://geek-goddess-bonnie.blogspot.com/2009/09/keeping-datagrids-and-other-ui-controls.htmlI had assumed your TextBox was databound like this:
MyTextBox.DataBindings.Add("Text", MyDataSet.Tables["MyTable"], "MyBoundColumn");
When, in reality, it's bound like this:
MyTextBox.DataBindings.Add("Text", MyDataSet, "MyTable.MyBoundColumn");
Consequently, you'd need an additional line of code to get the DataTable's Name:
string TableName = oBinding.BindingMemberInfo.BindingPath;
Then you can check whether your DataSource is a DataSet and if so, get the TableName as I did above and proceed. If it's not, then you already have the DataTable.
Your other question was about what to do if the DataSource is DataView rather than a DataTable. The answer is nothing ... at least as far as getting the column names. They'd be the same, whether they're in the DataTable or a DataView from that Table.
Now, all that said ... half of what I've been talking about probably has nothing to do with your original question, which was:
>Is there a way for a textbox to let it's findform produce these (dataset.datatable).cols?And I still quite understand what you're asking (sorry, I must be dense today).
~~Bonnie
>Dear Bonnie,
>
>Close, I guess.... but no cigar.
>
>Let me try to clarify:
>
>This is how I call the routine and define "cols"
>
>
> Private Sub frmXXX_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
> Me.MasKit(Me.XXXDataset.XXX.Columns)
> End Sub
>
>
>so, cols is really Me.XXXDataset.XXX.Columns is a DataColumnCollection, belonging to a datatable ... I think.
>
>in my baseform I have :
>
> Friend Sub MasKit(ByVal cols As DataColumnCollection)
> Dim ctrl2 As IControlMaskit = Nothing
> For Each Ctrl As Control In Me.Controls
> Dim lApplicable As Boolean = True
> Try
> ctrl2 = Ctrl
> Catch
> lApplicable = False
> End Try
> If lApplicable Then
> ctrl2.MaskIt(cols)
> End If
> Next
> End Sub
>
>
>and at the txtBase level (inferring from your wise advice ...)
>
>
> Friend Sub MaskIt(ByVal cols As DataColumnCollection) Implements IControlMaskit.MaskIt
> If Me.Mask <> "" Then
> Exit Sub
> End If
>
> Dim B As Binding = Me.DataBindings.Item(0)
> Dim t As DataTable = CType(B.DataSource, DataTable)
> Dim c As DataColumn = Nothing
>
> If t Is Nothing Then
> Dim t1 As DataView = B.DataSource
> c = t1.Columns(B.BindingMemberInfo.BindingField)
> Else
> c = t.Columns(Me.DataBindings.Item(0).BindingMemberInfo.BindingField)
> End If
>
> ' Dim o As DataColumn = cols(Me.DataBindings.Item(0).BindingMemberInfo.BindingField)
> Dim cT As String = c.DataType.ToString
> If cT = "System.String" Then
> Me.Mask = ">" & New String("A", c.MaxLength)
> Exit Sub
> End If
> If cT = "System.DateTime" Then
> Me.Mask = ">##/AAA/##"
> Exit Sub
> End If
> MsgBox(Me.Name & " cannot be masked yet (" & cT & ")")
> End Sub
>
>
>Now this won't compile because "columns is not a member of 'system.data.dataview', and leaving out the dataview section does not work. (I don't think I need the dataview section). When I debug, B.Datasource does not seem to be set (in fact it returns "nothing", your "null" I guess?)
>
>I get the feeling from what I read in my frmXXX.designer.vb that the datasource of the "binding" is a dataset, whereas you seemed to assume that it should be a datatable or a dataview.
>
>That is precisely the problem I guess, because the form generates a xxxdataset that and binds the controls to a datatable that belongs the xxxDataset and is called XXX and referred to as xxxDataset.xxx. And it's the latter that I would like get a hold of from my base class textbox.
>
>Thanks for caring and shoot away ....
>
>Marc
>
>>Marc,
>>
>>I'm not 100% sure exactly what you're trying to get at, but I'll give it a shot. What I'm not clear about in your post is what "cols" is. Here's a snippet of code that I have used in my TextBox sub-class (sorry, it's C#, so I hope you can follow it):
>>
>>
>>// oBinding is simply what the TextBox is bound to
>>// Me.DataBindings.Item(0) in your example
>>
>>int nRow = this.BindingContext[this.oBinding.DataSource].Position;
>>string field = this.oBinding.BindingMemberInfo.BindingField;
>>
>>DataTable table = null;
>>if (this.oBinding.DataSource is DataView)
>>{
>> nRow = CommonFunctions.IndexOfRow((DataView)this.oBinding.DataSource, nRow);
>> table = ((DataView)this.oBinding.DataSource).Table;
>>}
>>else
>> if (this.oBinding.DataSource is DataTable)
>> table = (DataTable)this.oBinding.DataSource;
>>
>>
>>It appears that you're also talking about a sub-classed control, I hope I am correct in that assumption. Since your question appears to be about whatever this "cols" thing is, I'm not sure if the above helps or not.
>>
>>If not, perhaps you can rephrase your question or post some more code.
>>
>>~~Bonnie
>>
>>
>>>I have found that
>>>
>>>Me.DataBindings.Item(0).BindingMemberInfo.BindingField
>>>
>>>
>>>gives me the name of the field a control is bound to.
>>>
>>>
>>>Dim o As DataColumn = cols(Me.DataBindings.Item(0).BindingMemberInfo.BindingField)
>>>
>>>
>>>gets me the column, or the field that I am looking for.
>>>
>>>cols is passed to the method from the form's dataset.datatable (I guess).
>>>
>>>Is there a way for a textbox to let it's findform produce these (dataset.datatable).cols?