fetching values from all textboxes in c# in one go? - c#

I want to capture all the textboxes values on button click in string without explicitly writing each of this line for each textbox in c# like
string atv1 = TextBox1.Text;
string atv2 = TextBox2.Text;
It should find all textboxes and make a string of it (join) .
can anyone help out !!
(window form when making some asp.net website (c#))

concise way :
String.Join(",",Form.Controls.OfType<TextBox>().Select(c => c.Text))

You can use a StringBuilder to "join" (most software types use the term concatenate) the strings. To get all the TextBoxes you can select any control on the form that is a text box. Simple solution is
var s = new StringBuilder();
foreach (var textbox in this.Controls.OfType<TextBox>())
{
s.AppendLine(textbox.Text)
}
Console.WriteLine(s.ToString());
However, a TextBox can be inside of a Control on the Form. So to handle this case you need recursion. I'll leave you to search StackOverflow to figure out how to do this.

foreach (Control c in this.Controls)
{
if (c is TextBox)
{
var txt = (TextBox)c;
//Do Something
}
}

More elegant way:
var objTextboxValues = this.Controls.OfType<TextBox>().Select(obj => obj.Text).ToList();
var varJoinedText = String.Join(", ", objTextboxValues);
Original Answer:
var varAllTextBoxValues = "";
foreach (Control objControl in this.Controls)
if (objControl is TextBox)
varAllTextBoxValues += ((TextBox)objControl).Text;
}
MessageBox.Show(varAllTextBoxValues);

Related

Is there a more line efficient way of clearing textboxes in C#?

I'm looking for an effective way of clearing textboxes, ideally in a function.
I have tried using:
{
Action<Control.ControlCollection> func = null;
func = (controls) =>
{
foreach (Control control in controls)
if (control is TextBox)
(control as TextBox).Clear();
else
func(control.Controls);
};
func(Controls);
}
The problem with the above solution is that I could not choose which text boxes were to be deleted.
TextBoxName.Text = "";
The above works however the only problem is that it takes up 200 lines
I have 61 boxes, i need a clear all button, that only clears 60 boxes (all except one)
i need clear row buttons, since the boxes are arranged in rows
there are 15 clear row buttons, each with 4 boxes, is there a for loop i can use that will only clear the ones i need (by name if possible)?
You could create a collection of TextBoxes to exempted and filter based on it. For example,
var exceptionList = new[] { textBox1 };
foreach(var textBox in Controls.OfType<TextBox>().Where(x=> !exceptionList.Contains(x)))
{
textBox.Clear();
}
If you want to filter based on the Control Name, you would use
foreach(var textBox in Controls.OfType<TextBox>().Where(x=> !exceptionList.Contains(x.Name)))
{
textBox.Clear();
}
Where exceptionList is collection of names of TextBoxes that needs to be exempted.

How to use int i for selecting text box NR

I have 10 text boxes. Like textBox1.Text , textBox2.Text and so on. I need to use textBox2.Text if i=2, textBox2.Text if i =3 and so on.
I did:
string t = "textBox"+i+".Text";
But outcome coming as "textBox1.Text".
How to insert 'i' Value into textBox name instead of 1. And get the outcome as textBox1.Text
So I can use it as name and pass value from textbox to my program.
Based on what I think you are asking, you could store a reference to each TextBox in an array and then use your int to reference it.
TextBox[] boxes = new TextBox[10];
boxes[0] = textBox1;
// ... follow the pattern
boxes[9] = textBox10;
string value = boxes[i-1].Text; // Gets the value of the textBoxi.Text
You can do it like so:
private TextBox GetTB(int i) {
string name = "textBox" + i.ToString();
foreach (var ctrl in Controls) {
var tbox = ctrl as TextBox;
if (tbox?.Name == name) return tbox;
}
return null
}
The easiest way, if you need to access them in C# code this way, would be to maintain an array or List of these textboxes, indexed in order of their numeric value. Then you could simply reference textBoxes[i-1] and get the textbox numbered "i". How you get that array depends on exactly what you're developing. For WinForms, you can use a little Linq on the Form.Controls property:
public static IEnumerable<Control> Flatten(this IEnumerable<Control> controls)
{
var results = new List<Control>();
foreach (var control in controls)
{
results.Add(control);
control.Controls.OfType<Control>().Flatten(results);
}
return results;
}
private static void Flatten(this IEnumerable<Control> controls, List<Control> results)
{
foreach (var control in controls)
{
results.Add(control);
control.Controls.OfType<Control>().Flatten(results);
}
}
...
var textboxes = Form.Controls.Flatten()
.OfType<TextBox>()
.Where(t=>t.Name.StartsWith("textBox"))
.OrderBy(t=>t.Name)
.ToArray();

Retaining Textbox Value

I'm trying to update a person's details in the database. Since I'm using textboxes, how would I keep the original value if the textbox is empty?
I'm trying to write it in a short way rather than having a tonne of IF statements.
The code I've written will work but not the way I want, any suggestions on what I could do?
Code (C#):
foreach (Control c in pnlUpdate.Controls)
{
if (c is TextBox)
{
TextBox questionTextBox = c as TextBox;
if (questionTextBox.Text == "")
{
questionTextBox.Text = pat[0].Forename;
questionTextBox.Text = pat[0].Surname;
questionTextBox.Text = pat[0].Street;
questionTextBox.Text = pat[0].Town;
questionTextBox.Text = pat[0].City;
questionTextBox.Text = pat[0].DOB.ToString();
questionTextBox.Text = pat[0].House_number;
questionTextBox.Text = pat[0].Mobile;
}
}
}
Pat = database object
I'm trying to update a person's details in the database. Since I'm using textboxes, how would I keep the original value if the textbox is empty?
Use Server Validation. To make sure that user has entered values for all controls you need to use RequiredFieldValidator. Go through below link:
http://msdn.microsoft.com/en-us/library/5hbw267h(v=vs.80).aspx
Something like below will provide you the help
pat[0].Name = TextBox.Text == "" ? pat[0].Name : TextBox.Text

Store textbox values in an array in c#

I have a form with 10 TextBoxes and OK button.
When the OK button was clicked. I need to store the values from the textboxes to a string of array.
Can someone help me please?
I need to store the values from the textboxes to a string of array.
string[] array = this.Controls.OfType<TextBox>()
.Select(r=> r.Text)
.ToArray();
The above expects the TextBoxes to be on the Form directly, not inside a container, if they are inside multiple containers then you should get all the controls recursively.
Make sure you include using System.Linq;.
If you are using lower frameworks than .Net Framework 3.5. Then you can use a simple foreach loop like:
List<string> list = new List<string>();
foreach(Control c in this.Controls)
{
if(c is TextBox)
list.Add((c as TextBox).Text);
}
(this would work with .Net framework 2.0 onward)
To get all textboxes not only the direct childs of the form (this)
Func<Control, IEnumerable<Control>> allControls = null;
allControls = c => new Control[] { c }.Concat(c.Controls.Cast<Control>().SelectMany(x => allControls(x)));
var all = allControls(this).OfType<TextBox>()
.Select(t => t.Text)
.ToList();

Loop through Textboxes

I have a winforms app that has 37 textboxes on the screen. Each one is sequentially numbered:
DateTextBox0
DateTextBox1 ...
DateTextBox37
I am trying to iterate through the text boxes and assign a value to each one:
int month = MonthYearPicker.Value.Month;
int year = MonthYearPicker.Value.Year;
int numberOfDays = DateTime.DaysInMonth(year, month);
m_MonthStartDate = new DateTime(year, month, 1);
m_MonthEndDate = new DateTime(year, month, numberOfDays);
DayOfWeek monthStartDayOfWeek = m_MonthStartDate.DayOfWeek;
int daysOffset = Math.Abs(DayOfWeek.Sunday - monthStartDayOfWeek);
for (int i = 0; i <= (numberOfDays - 1); i++)
{
//Here is where I want to loop through the textboxes and assign values based on the 'i' value
DateTextBox(daysOffset + i) = m_MonthStartDate.AddDays(i).Day.ToString();
}
Let me clarify that these textboxes appear on separate panels (37 of them). So in order for me to loop through using a foreach, I have to loop through the primary controls (the panels), then loop through the controls on the panels. It starts getting complicated.
Any suggestions on how I can assign this value to the textbox?
To get all controls and sub-controls recursively of specified type, use this extension method:
public static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control
{
var children = (control.Controls != null) ? control.Controls.OfType<TControl>() : Enumerable.Empty<TControl>();
return children.SelectMany(c => GetChildControls<TControl>(c)).Concat(children);
}
usage:
var allTextBoxes = this.GetChildControls<TextBox>();
foreach (TextBox tb in allTextBoxes)
{
tb.Text = ...;
}
You Could loop all the controls in the form asking one by one if it is a "Textbox" y ther return the complete List of them.
public List GetTextBoxes(){
var textBoxes = new List();
foreach (Control c in Controls){
if(c is TextBox){
textBoxes.add(c);
}
}
return textBoxes;
}
You can loop through the textboxes in your form in a fairly simple manner:
Func<ControlCollection, List<TextBox>> SearchTextBoxes = null;
SearchTextBoxes = coll => {
List<TextBox> textBoxes = new List<TextBox>();
foreach (Control c in coll) {
TextBox box = c as TextBox;
if (box != null)
textBoxes.Add(box);
if (c.Controls.Count > 0)
textBoxes.AddRange(SearchTextBoxes(c.Controls));
}
return textBoxes;
};
var tbs = SearchTextBoxes(this.Controls).OrderBy(tb => tb.Name);
Edit: Changed according to new requirements. Not nearly as elegant as the LINQ-solution, of course :)
Since this post seems to resurrect itself from time to time and since the solutions above do not find controls inside of controls, such as in a groupbox, this will find them. Just add your control type:
public static IList<T> GetAllControls<T>(Control control) where T : Control
{
var lst = new List<T>();
foreach (Control item in control.Controls)
{
var ctr = item as T;
if (ctr != null)
lst.Add(ctr);
else
lst.AddRange(GetAllControls<T>(item));
}
return lst;
}
And it's use:
var listBoxes = GetAllControls<ListBox>(this);
foreach (ListBox lst in listBoxes)
{
//Do Something
}
Iterate through controls within form and check name of the control if matched then set Text property as you require.
int i = 0;
foreach (Control contrl in this.Controls) {
if (contrl.Name == ("DateTextBox" + i.ToString())) {
contrl.Text = "requiredtexttobeset";
}
i = i + 1;
}
If you want to do without 'foreach' (If you have specific boxes to adjust/address)
int numControls = Page.Form.Controls.Count;
for (int i = 0; i < numControls; i++)
{
if (Page.Form.Controls[i] is TextBox)
{
TextBox currBox = Page.Form.Controls[i] as TextBox;
currbox.Text = currbox.TabIndex.ToString();
}
}
//THE EASY WAY! Always post easy solutions. It's the best way.
//This code is used to loop through all textboxes on a form for data validation.
//If an empty textbox is found, Set the error provider for the appropriate textbox.
foreach (var control in Controls)
{
if (control is TextBox)
{
//Box the control into a textbox. Not really needed, but do it anyway
var textbox = (TextBox)control;
if (String.IsNullOrWhiteSpace(textbox.Text))
{
//Set the errorProvider for data validation
errorProvider1.SetError(textbox, "Data Required!");
textbox.Text = String.Empty; //Clear out the whitespace if necessary
//blnError = true;
}
}
}
You can simply do this mate...
foreach (TextBox txt in this.Panel.Controls.OfType<TextBox>())
{
txt.Text="some value you assign";
}
If your text boxes are on the form directly and not on a Panel then you can replace this.Panel.Controls with this.Controls. That should be short and clear enough for you.
After the InitialiseComponents() call, add the textboxes to a collection member variable on the form. You can then iterate through them in order later on.
You can create a Dictionary of TextBox, int like the following
Dictionary<TextBox, int> textBoxes = new Dictionary<TextBox, int>();
foreach (TextBox control in Controls.OfType<TextBox>())
textBoxes[control] = Convert.ToInt32(control.Name.Substring(11));
Now.. to loop through them..
foreach (var item in textBoxes.Select(p => new { textBox = p.Key, no = p.Value}))
item.textBox.Text = item.no.ToString(); // whatever you want...
Good luck!
Since you already know the name of control, therefore you can search the control by its name.
See Get a Windows Forms control by name in C#
Other answers just not cutting it for you?
I found this as an answer to a similar question on SO, but I can't find the thread now. It recursively loops through ALL controls of a given type which are located within a control. So includes children of children of children of... etc. My example changes the ForeColor of each TextBox to Hot Pink!
public IEnumerable<Control> GetAllControlsOfType(Control control, Type type)
{
var controls = control.Controls.Cast<Control>();
return controls.SelectMany(ctrl => GetAllControlsOfType(ctrl, type))
.Concat(controls)
.Where(c => c.GetType() == type);
}
Implementation:
IEnumerable<Control> allTxtBxs = GetAllControlsOfType(this, typeof(TextBox));
foreach (TextBox txtBx in allTxtBxs)
{
txtBx.ForeColor = Color.HotPink;
}
Quite similar to abatishchev's answer(which, for me, only returned first-level child controls), but different enough to merit it's own answer I think.

Categories

Resources