谢谢有点甜,这个确实弄得头晕。我也采用增加临时列的方式,每次控制只能选择一个日期列,多个就不知道怎么弄了。因为增加后会导致表改变,如果切换到其他表会提示保存,所以只好在最后生成目录树后又将表还原了。
Dim Y As WinForm.RadioButton = e.Form.Controls("RbtF_Y")
Dim YM As WinForm.RadioButton = e.Form.Controls("RbtF_YM")
Dim tr As WinForm.TreeView = e.Form.Controls("Tr_Flt")
Dim s As String = e.Sender.Text
If s = "" OrElse s = "先选择分组列" OrElse Mtb Is Nothing Then
Return
End If
Dim t As Integer
Dim dt As DataTable
Dim dr As DataRow
Dim dc As DataCol
Dim ColS As String
dt = CurrentTable.DataTable
tr.StopRedraw()
tr.Nodes.Clear
'根据所选日期列类型替换分组列的值以便生成所需要的日期目录树
Dim Values() As String
Values = s.split("|")
For i As Integer = 0 To Values.Length - 1
If dt.dataCols(Values(i)).IsDate Then
ColS = Values(i)
t = t + 1
If t > 1 Then
e.Sender.Text = ""
MessageBox.Show("一次只能选择一个日期列!","提示")
Return
End If
If dt.dataCols.Contains(Values(i) & "Y") = False Then
dt.dataCols.Add(Values(i) & "Y",Gettype(Integer))
dt.dataCols.Add(Values(i) & "M",Gettype(Integer))
CurrentTable.Cols(Values(i) & "Y").Visible = False
CurrentTable.Cols(Values(i) & "M").Visible = False
For Each dr In dt.DataRows
dr(Values(i) & "Y") = Year(dr(Values(i)))
dr(Values(i) & "M") = Month(dr(Values(i)))
Next
End If
If Y.checked = True Then
s = s.Replace(ColS,ColS & "Y")
ElseIf YM.checked = True Then
s = s.Replace(ColS,ColS & "Y|" & ColS & "M")
End If
End If
Next
tr.BuildTree(dt,s)
tr.ResumeRedraw()
If tr.AllNodes.Count > 0 Then
tr.Nodes.Insert("显示所有",0)
End If
tr.Select()
dt.RejectChanges()