|
Hi everybody,
I'm quite new in WPF and C# programming so I don't know if what I'm going to say is feasible or not.
I would like to dynamically associate a treeview to each tab of a tabcontrol, depending on the name of that tab.
Let's consider for example 2 collections of treeviews:
- Treeview A: A1={A1.1, A1.2, A1.3} and A2={A2.1, A2.2, A2.3, A2.4}
- Treeview B: B1={B1.1, B1.2, B1.3} and B2={B2.1, B2.2}
The goal is to get the index (or the name) of each displayed tab of the tabcontrol. And, if that index (or name) is A, then the treeview A should be displayed on tab A. Otherwise, if the name of the tab is B, then treeview B shall be displayed.
Has someone an idea on how to proceed using data binding?
Thanks,
RV
|
|
|
|
|
This requirement smells! It feels like you could use the same treeview and bind different collections to the treeview.
The standard design would be to create each tab with a treeview in it. If you want to limit the size of the viewmodel then each tab would have a usercontrol holding the treeview with a seperate VM supporting it.
Take a look at Simplifying the WPF TreeView by Using the ViewModel Pattern from Josh Smith, I based my extensive use of the treeview and treelistview on his design.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Hi all!
this algorithm written in c# :
// Derived from LINPACK code.
// Initialize.
double[][] A = Arg;
// m = Arg.RowDimension;
// n = Arg.ColumnDimension;
int nu = System.Math.Min(m, n);
double[] s = new double[System.Math.Min(m + 1, n)];
double[][] U = new double[m][];
for (int i = 0; i < m; i++)
{
U[i] = new double[nu];
}
double[][] V = new double[n][];
for (int i2 = 0; i2 < n; i2++)
{
V[i2] = new double[n];
}
double[] e = new double[n];
double[] work = new double[m];
bool wantu = true;
bool wantv = true;
// Reduce A to bidiagonal form, storing the diagonal elements
// in s and the super-diagonal elements in e.
int nct = System.Math.Min(m - 1, n);
int nrt = System.Math.Max(0, System.Math.Min(n - 2, m));
for (int k = 0; k < System.Math.Max(nct, nrt); k++)
{
if (k < nct)
{
// Compute the transformation for the k-th column and
// place the k-th diagonal in s[k].
// Compute 2-norm of k-th column without under/overflow.
s[k] = 0;
for (int i = k; i < m; i++)
{
s[k] = System.Math.Sqrt(s[k] * s[k] + A[i][k] * A[i][k]);
}
if (s[k] != 0.0)
{
if (A[k][k] < 0.0)
{
s[k] = -s[k];
}
for (int i = k; i < m; i++)
{
A[i][k] /= s[k];
}
A[k][k] += 1.0;
}
s[k] = -s[k];
}
for (int j = k + 1; j < n; j++)
{
if ((k < nct) & (s[k] != 0.0))
{
// Apply the transformation.
double t = 0;
for (int i = k; i < m; i++)
{
t += A[i][k] * A[i][j];
}
t = (-t) / A[k][k];
for (int i = k; i < m; i++)
{
A[i][j] += t * A[i][k];
}
}
// Place the k-th row of A into e for the
// subsequent calculation of the row transformation.
e[j] = A[k][j];
}
if (wantu & (k < nct))
{
// Place the transformation in U for subsequent back
// multiplication.
for (int i = k; i < m; i++)
{
U[i][k] = A[i][k];
}
}
if (k < nrt)
{
// Compute the k-th row transformation and place the
// k-th super-diagonal in e[k].
// Compute 2-norm without under/overflow.
e[k] = 0;
for (int i = k + 1; i < n; i++)
{
e[k] = System.Math.Sqrt(e[k] * e[k] + e[i] * e[i]);
}
if (e[k] != 0.0)
{
if (e[k + 1] < 0.0)
{
e[k] = -e[k];
}
for (int i = k + 1; i < n; i++)
{
e[i] /= e[k];
}
e[k + 1] += 1.0;
}
e[k] = -e[k];
if ((k + 1 < m) & (e[k] != 0.0))
{
// Apply the transformation.
for (int i = k + 1; i < m; i++)
{
work[i] = 0.0;
}
for (int j = k + 1; j < n; j++)
{
for (int i = k + 1; i < m; i++)
{
work[i] += e[j] * A[i][j];
}
}
for (int j = k + 1; j < n; j++)
{
double t = (-e[j]) / e[k + 1];
for (int i = k + 1; i < m; i++)
{
A[i][j] += t * work[i];
}
}
}
if (wantv)
{
// Place the transformation in V for subsequent
// back multiplication.
for (int i = k + 1; i < n; i++)
{
V[i][k] = e[i];
}
}
}
}
// Set up the final bidiagonal matrix or order p.
int p = System.Math.Min(n, m + 1);
if (nct < n)
{
s[nct] = A[nct][nct];
}
if (m < p)
{
s[p - 1] = 0.0;
}
if (nrt + 1 < p)
{
e[nrt] = A[nrt][p - 1];
}
e[p - 1] = 0.0;
// If required, generate U.
if (wantu)
{
for (int j = nct; j < nu; j++)
{
for (int i = 0; i < m; i++)
{
U[i][j] = 0.0;
}
U[j][j] = 1.0;
}
for (int k = nct - 1; k >= 0; k--)
{
if (s[k] != 0.0)
{
for (int j = k + 1; j < nu; j++)
{
double t = 0;
for (int i = k; i < m; i++)
{
t += U[i][k] * U[i][j];
}
t = (-t) / U[k][k];
for (int i = k; i < m; i++)
{
U[i][j] += t * U[i][k];
}
}
for (int i = k; i < m; i++)
{
U[i][k] = -U[i][k];
}
U[k][k] = 1.0 + U[k][k];
for (int i = 0; i < k - 1; i++)
{
U[i][k] = 0.0;
}
}
else
{
for (int i = 0; i < m; i++)
{
U[i][k] = 0.0;
}
U[k][k] = 1.0;
}
}
}
// If required, generate V.
if (wantv)
{
for (int k = n - 1; k >= 0; k--)
{
if ((k < nrt) & (e[k] != 0.0))
{
for (int j = k + 1; j < nu; j++)
{
double t = 0;
for (int i = k + 1; i < n; i++)
{
t += V[i][k] * V[i][j];
}
t = (-t) / V[k + 1][k];
for (int i = k + 1; i < n; i++)
{
V[i][j] += t * V[i][k];
}
}
}
for (int i = 0; i < n; i++)
{
V[i][k] = 0.0;
}
V[k][k] = 1.0;
}
}
// Main iteration loop for the singular values.
int pp = p - 1;
int iter = 0;
double eps = System.Math.Pow(2.0, -52.0);
while (p > 0)
{
int k, kase;
// Here is where a test for too many iterations would go.
// This section of the program inspects for
// negligible elements in the s and e arrays. On
// completion the variables kase and k are set as follows.
// kase = 1 if s(p) and e[k-1] are negligible and k<p
kase="2" if="" s(k)="" is="" negligible="" and="" k<p
="" e[k-1]="" negligible,="" k<p,="" and
="" s(k),="" ...,="" s(p)="" are="" not="" (qr="" step).
="" e(p-1)="" (convergence).
="" for="" (k="p" -="" 2;="" k="">= -1; k--)
{
if (k == -1)
{
break;
}
if (System.Math.Abs(e[k]) <= eps * (System.Math.Abs(s[k]) + System.Math.Abs(s[k + 1])))
{
e[k] = 0.0;
break;
}
}
if (k == p - 2)
{
kase = 4;
}
else
{
int ks;
for (ks = p - 1; ks >= k; ks--)
{
if (ks == k)
{
break;
}
double t = (ks != p ? System.Math.Abs(e[ks]) : 0.0) + (ks != k + 1 ? System.Math.Abs(e[ks - 1]) : 0.0);
if (System.Math.Abs(s[ks]) <= eps * t)
{
s[ks] = 0.0;
break;
}
}
if (ks == k)
{
kase = 3;
}
else if (ks == p - 1)
{
kase = 1;
}
else
{
kase = 2;
k = ks;
}
}
k++;
// Perform the task indicated by kase.
switch (kase)
{
// Deflate negligible s(p).
case 1:
{
double f = e[p - 2];
e[p - 2] = 0.0;
for (int j = p - 2; j >= k; j--)
{
double t = System.Math.Sqrt(s[j] * s[j] + f * f);
double cs = s[j] / t;
double sn = f / t;
s[j] = t;
if (j != k)
{
f = (-sn) * e[j - 1];
e[j - 1] = cs * e[j - 1];
}
if (wantv)
{
for (int i = 0; i < n; i++)
{
t = cs * V[i][j] + sn * V[i][p - 1];
V[i][p - 1] = (-sn) * V[i][j] + cs * V[i][p - 1];
V[i][j] = t;
}
}
}
}
break;
// Split at negligible s(k).
case 2:
{
double f = e[k - 1];
e[k - 1] = 0.0;
for (int j = k; j < p; j++)
{
double t = System.Math.Sqrt(s[j] * s[j] + f * f);
double cs = s[j] / t;
double sn = f / t;
s[j] = t;
f = (-sn) * e[j];
e[j] = cs * e[j];
if (wantu)
{
for (int i = 0; i < m; i++)
{
t = cs * U[i][j] + sn * U[i][k - 1];
U[i][k - 1] = (-sn) * U[i][j] + cs * U[i][k - 1];
U[i][j] = t;
}
}
}
}
break;
// Perform one qr step.
case 3:
{
// Calculate the shift.
double scale = System.Math.Max(System.Math.Max(System.Math.Max(System.Math.Max(System.Math.Abs(s[p - 1]), System.Math.Abs(s[p - 2])), System.Math.Abs(e[p - 2])), System.Math.Abs(s[k])), System.Math.Abs(e[k]));
double sp = s[p - 1] / scale;
double spm1 = s[p - 2] / scale;
double epm1 = e[p - 2] / scale;
double sk = s[k] / scale;
double ek = e[k] / scale;
double b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2.0;
double c = (sp * epm1) * (sp * epm1);
double shift = 0.0;
if ((b != 0.0) | (c != 0.0))
{
shift = System.Math.Sqrt(b * b + c);
if (b < 0.0)
{
shift = -shift;
}
shift = c / (b + shift);
}
double f = (sk + sp) * (sk - sp) + shift;
double g = sk * ek;
// Chase zeros.
for (int j = k; j < p - 1; j++)
{
double t = System.Math.Sqrt(f * f + g * g);
double cs = f / t;
double sn = g / t;
if (j != k)
{
e[j - 1] = t;
}
f = cs * s[j] + sn * e[j];
e[j] = cs * e[j] - sn * s[j];
g = sn * s[j + 1];
s[j + 1] = cs * s[j + 1];
if (wantv)
{
for (int i = 0; i < n; i++)
{
t = cs * V[i][j] + sn * V[i][j + 1];
V[i][j + 1] = (-sn) * V[i][j] + cs * V[i][j + 1];
V[i][j] = t;
}
}
t = System.Math.Sqrt(f * f + g * g);
cs = f / t;
sn = g / t;
s[j] = t;
f = cs * e[j] + sn * s[j + 1];
s[j + 1] = (-sn) * e[j] + cs * s[j + 1];
g = sn * e[j + 1];
e[j + 1] = cs * e[j + 1];
if (wantu && (j < m - 1))
{
for (int i = 0; i < m; i++)
{
t = cs * U[i][j] + sn * U[i][j + 1];
U[i][j + 1] = (-sn) * U[i][j] + cs * U[i][j + 1];
U[i][j] = t;
}
}
}
e[p - 2] = f;
iter = iter + 1;
}
break;
// Convergence.
case 4:
{
// Make the singular values positive.
if (s[k] <= 0.0)
{
s[k] = (s[k] < 0.0 ? -s[k] : 0.0);
if (wantv)
{
for (int i = 0; i <= pp; i++)
{
V[i][k] = -V[i][k];
}
}
}
// Order the singular values.
while (k < pp)
{
if (s[k] >= s[k + 1])
{
break;
}
double t = s[k];
s[k] = s[k + 1];
s[k + 1] = t;
if (wantv && (k < n - 1))
{
for (int i = 0; i < n; i++)
{
t = V[i][k + 1]; V[i][k + 1] = V[i][k]; V[i][k] = t;
}
}
if (wantu && (k < m - 1))
{
for (int i = 0; i < m; i++)
{
t = U[i][k + 1]; U[i][k + 1] = U[i][k]; U[i][k] = t;
}
}
k++;
}
iter = 0;
p--;
}
break;
}
}
}
algo compute an svd decompostion, first he decompose it into qr, and what's next didn't knew how it do to get eigen values and eigen vectors ?
|
|
|
|
|
|
thank you for you're post, I read all the algorithms, and remain all the same.
I didn't get the idea of what they do, first lines of the loop they decompose it into qr,
the diagonal in s and the super diagonal in e. but after ... too hairy (eigen values, eigen vectors)
|
|
|
|
|
Then to be honest, you need to learn some math before you start implementation - if you don't understand an algorithm, you have no idea how to debug it (or even how to test it!)
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I will check some math then !
|
|
|
|
|
I want to write one code to fill more comboboxes.
The code is running ok except ' mycbox.Items.Add("een") ' in the final rule.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FindcboBox
{
public partial class Form1 : Form
{
public ComboBox mycbox;
public Form1()
{
InitializeComponent();
{
Cbo1.Items.Clear();
Cbo1.Items.Add("een");
Cbo1.Items.Add("twee");
}
}
private void Button1_Click(object sender, EventArgs e)
{
GetcboBox("Cbo1");
GetcboBox("Cbo2");
GetcboBox("Cbo3");
}
private void GetcboBox(string cbName)
{
mycbox = new ComboBox();
foreach (Control mycbox in this.Controls)
{
if (mycbox is ComboBox & mycbox.Name == cbName)
{
MessageBox.Show("hallo");
mycbox.Text = "kl";
mycbox.Items.Add("een");
}
}
}
}
|
|
|
|
|
Please remember we can't see your screen and we don't have access to your requirements so we don't actually know what you mean when you say that the code runs okay except for the final ComboBox. Are you seeing an exception? Not seeing something you'd expect to see?
This space for rent
|
|
|
|
|
while writing the code a red line appears unther the text "Items".
while cursor above this remark:
"control does not contain a definition for 'items' and no extension method 'items' accepting a first argument of type ' control' could be found (are you missing a using directive or an assembly reference?)"
|
|
|
|
|
That's because mycbo is a Control, not a ComboBox. Look where you defined mycbo , in the foreach .
System.ItDidntWorkException: Something didn't work as expected.
C# - How to debug code[ ^].
Seriously, go read these articles.
Dave Kreskowiak
|
|
|
|
|
Dave's answer is the one you should be following. Just for completeness: The reason why Visual Studio shows a squiggly red line under Items is because mycbox is of the type Control and not ComboBox , and as a Control it doesn't have an Items -property. You verified that it actually is a ComboBox but that doesn't "automagically" make the variable mycbox of that type. You would have to cast it to ComboBox before being able to access its Items -property:
((ComboBox)mycbox).Items.Add("een");
If you get squiggly red lines place the mouse cursor on it and Visual Studio will (usually) give you a pretty good hint at what's wrong with it in a popup-tooltip.
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
|
You're welcome and good luck
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
|
|
|
|
|
Why on earth are you adding items to a combo box in a method that is named Getsomething and the method doesn't return anything?
Your GetcobBox method is also naive. It will only look in top-level controls on a form. If they are in containers, such as a Panel or GroupBox, they won't be found.
You've got a lot of learning to do. You're creating a ComboBox control in your GetcboBox method, then throwing it away. You're also not using a logical AND operator in your if statement, you're using a binary AND operator (&).
Your GetcboBox method should be something more like this:
private ComboBox GetComboBoxByName(string name)
{
foreach (Control control in this.Controls)
{
if (control is ComboBox && control.Name == name)
{
return control;
}
if (control.HasChildren)
{
return GetComboBoxByName(name);
}
}
return null;
}
But, there's an even easier way to do it by having the .NET Framework do the work for you. Since you can't have two controls on the form with the exact same name, this will either return the control you're looking for, return null, or throw an exception because the control that was found isn't a ComboBox:
private ComboBox GetComboBoxByName(string name)
{
Control[] candidates = this.Controls.Find(name, true);
return (ComboBox)candidates.FirstOrDefault();
}
Keep in mind, this is an example and is not meant to by used in a production application.
System.ItDidntWorkException: Something didn't work as expected.
C# - How to debug code[ ^].
Seriously, go read these articles.
Dave Kreskowiak
|
|
|
|
|
Thanks David!
I'm just started programming in C# so indeed I have to learn a lot.
These answers help me.
Best regards,
J.Dunnewijk
|
|
|
|
|
I have a reportviewer with a column have only two value is BA & FA but when i filter this column by like or = function, it couldn't active, change < or > it will active. when tried with other column,it also active.
Please help me fix this problem, i need filter with that column with like, = function.
i used dataparameter to create expression with these functions.
|
|
|
|
|
|
timer.start and timer.stop is not supported in windows ce
|
|
|
|
|
This is not a good question - we cannot work out from that little what you are trying to do.
Remember that we can't see your screen, access your HDD, or read your mind - we only get exactly what you type to work with.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
|
Read the following from the CP daily news about C# nullable reference types.
Introducing Nullable Reference Types in C# | .NET Blog[^]
I have got to say that this is one of the best new language features that I have seen in a long time. Last I can recall specifically that I liked was generics in Java - like them but didn't care much for the hacked implementation required to make them 'fit' in java.
But, at least based on this description for the feature above in C#, I like the idea and how they are going to implement it.
|
|
|
|
|
Since we were talking about patterns in another thread, I assume you're familiar with the Null object pattern - Wikipedia[^]?
Funny article BTW; I did not expect that a "null reference" needed to be implemented as a feature.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I believe I looked at that long ago.
C++ api libraries (standard) have a similar class called auto_ptr. I tried it and didn't find it particularly useful. Probably due to the complexity of usage in some cases. Perhaps the same reason that it is now deprecate in C++ (but to be clear I cannot remember why I didn't like it.)
|
|
|
|
|
I would not call the example C# code complex.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|