Access different columns from LINQ resultset - c#

I have a query which returns multiple columns from the database using LINQ
var donors = from d2 in db.Donors
where d2.Status == "Pending"
select new { donorID = d2.donorID, bloodGroup = d2.bloodGroup, contactNo = d2.contactMobile, status = d2.Status };
now I want to display the results in different Labels accessing one column value from donors resultset.
ex:
Label1.Text = donorID;
Label2.Text = bloodGroup; ...and so on
please help me achieve this.

If you're going to set a label to a value, you'll need a single record. Currently you're selecting a sequence of records. Let's suppose you're only interested in the first value. You could write:
var donors = from d2 in db.Donors
where d2.Status == "Pending"
select new { d2.donorID, d2.bloodGroup,
contactNo = d2.contactMobile, status = d2.Status };
var firstDonor = donors.FirstOrDefault();
if (firstDonor != null)
{
Label1.Text = firstDonor.donorID;
Label2.Text = firstDonor.bloodGroup;
// ...
}
else
{
// There weren't any matching donors
}
If you want to display all the donor details, you'll want something more like a grid.

If you insist in keeping the labels, you could do something like this
var donors = from d2 in db.Donors
where d2.Status == "Pending"
select d2;
List<Donors> myDonors = donors.ToList();
int x = 0;
int y = 0;
foreach (var donor in donors)
{
Label myLabel = new Label();
myLabel.Top = x;
myLabel.Left = y;
myLabel.Text = donor.donorID.ToString();
panel1.Controls.Add(myLabel);
y += myLabel.Width + 5;
myLabel = new Label();
myLabel.Top = x;
myLabel.Left = y;
myLabel.Text = donor.blodGroup.ToString();
panel1.Controls.Add(myLabel);
y += myLabel.Width + 5;
myLabel = new Label();
myLabel.Top = x;
myLabel.Left = y;
myLabel.Text = donor.contactNo.ToString();
panel1.Controls.Add(myLabel);
y += myLabel.Width + 5;
myLabel = new Label();
myLabel.Top = x;
myLabel.Left = y;
myLabel.Text = donor.status.ToString();
panel1.Controls.Add(myLabel);
y += myLabel.Width + 5;
y = 0;
x += myLabel.Height + 5;
}

Related

Where is data updated in a DataGridView?

I am creating a tab page entirley programatically from a button press in the root page of a tabbed control. At present all the page initialisation takes place in the button click method. After all the instantiation, data capture from file and so on, I finally want to adjust the column widths in the data grid view, so that all the row data appears without having to have horizontal scroll bars. With the help of all your contributors I have managed to get it all working but the last step. Running at full speed it appears the DataGridView is accessed before the data load from the table is complete as it fails with an exception because the count derived from RegistersGrid.ColumnCount (local variable l) is zero. It all works fine if I step through the code. I am assuming that I need to put a Mutex of some form to wait for the transfer to complete, but I can't work out where that is taking place in order to reset the flag! If someone can point me in the right direction or if there is better more structured way to approach this I would deeply appreciate the help :-)
I have included all the code in the method just in case, I am afraid I date back a long way so if this looks like the awkward child of assembler,pascal and c with a little c# thrown in, my apologies....it's my age :-)
private void AddModuleButton_Click(object sender, EventArgs e)
{
string ModuleID = null;
string ModuleTypeFileNumber = null;
string ModuleType = null;
int TabID = 0;
openFileDialog1.Filter = "Text Files (.txt)|*.txt";
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
using (StreamReader reader = new StreamReader(openFileDialog1.FileName))
{
string newline;
if ((newline = reader.ReadLine()) != null)
{
string[] values = newline.Split((char)9);
ModuleTypeFileNumber = values[1];
}
if ((newline = reader.ReadLine()) != null)
{
string[] values = newline.Split();
ModuleID = values[0];
ModuleType = values[1];
}
bool AbsorbLines = true;
while (AbsorbLines && ((newline = reader.ReadLine()) != null))
{
string[] values = newline.Split();
if (values[0] == "Readings") AbsorbLines = false;
}
string[] columnnames = { "Summary", "access", "register", "Module & Name", "Value", "unit", "type", "Res" };
string[] columntypes = { "System.Boolean", "System.String", "System.Int32", "System.String", "System.Int32", "System.String", "System.String", "System.String" };
int[] columnwidth = { 1,2,3,35,10,5,5,5 };
DataTable dt = new DataTable();
for(int i =0; i < columnnames.Length; i++)
{
DataColumn colString = new DataColumn(columnnames[i]);
colString.DataType = System.Type.GetType(columntypes[i]);
dt.Columns.Add(colString);
}
while (ImportTable("Controls", reader.ReadLine(), dt, "RO")) { } // Import the "readings" section
while (ImportTable("Status bits", reader.ReadLine(), dt, "RW")) { } // Import the "controls" section
reader.Close();
registerTables.Add(ModuleID, dt);
// create a new tab page
TabPage page = new TabPage(ModuleID);
InterbusRegisters.TabPages.Add(page);
//
// tabPage1
//
Button ResizeButton = new Button();
Button RemoveButton = new Button();
Label VersionLabel = new Label();
Label SerialNolabel = new Label();
TextBox VersionNoTB = new TextBox();
TextBox SerialNoTB = new TextBox();
DataGridView RegistersGrid = new DataGridView();
//
// Set the properties of the DataGrid.
//
RegistersGrid.AccessibleName = ModuleID + "Grid";
RegistersGrid.Location = new System.Drawing.Point(3,29);
RegistersGrid.Width = page.Width - 6;
RegistersGrid.Height = page.Height - 29;
RegistersGrid.Anchor = (AnchorStyles.Top | AnchorStyles.Left);
RegistersGrid.DataSource = dt;
RegistersGrid.Dock = (DockStyle)2;
//
// RemoveButtonRegistersGrid
//
RemoveButton.BackColor = System.Drawing.Color.Red;
RemoveButton.Location = new System.Drawing.Point(3, 4);
RemoveButton.Name = "RemoveButton";
RemoveButton.Size = new System.Drawing.Size(75, 25);
RemoveButton.TabIndex = 0;
RemoveButton.Text = "Remove";
RemoveButton.UseVisualStyleBackColor = false;
RemoveButton.Click += new System.EventHandler(this.RemoveButton_Click);
//
// ResizeButton
//
ResizeButton.BackColor = System.Drawing.Color.DarkOrange;
ResizeButton.Location = new System.Drawing.Point(81, 4);
ResizeButton.Name = "ResizeButton";
ResizeButton.Size = new System.Drawing.Size(75, 25);
ResizeButton.TabIndex = 6;
ResizeButton.Text = "Resize";
ResizeButton.UseVisualStyleBackColor = false;
ResizeButton.Click += new System.EventHandler(this.ResizeButton_Click);
//
// SerialNolabel
//
SerialNolabel.AutoSize = true;
SerialNolabel.Location = new System.Drawing.Point(159, 10);
SerialNolabel.Name = "SerialNolabel";
SerialNolabel.Size = new System.Drawing.Size(53, 13);
SerialNolabel.TabIndex = 4;
SerialNolabel.Text = "Serial No:";
//
// SerialNoTB
//
SerialNoTB.Location = new System.Drawing.Point(215, 7);
SerialNoTB.Name = "SerialNoTB";
SerialNoTB.Size = new System.Drawing.Size(100, 20);
SerialNoTB.TabIndex = 1;
//
// VersionLabel
//
VersionLabel.AutoSize = true;
VersionLabel.Location = new System.Drawing.Point(318, 10);
VersionLabel.Name = "VersionLabel";
VersionLabel.Size = new System.Drawing.Size(45, 13);
VersionLabel.TabIndex = 5;
VersionLabel.Text = "Version:";
//
// VersionTB
//
VersionNoTB.Location = new System.Drawing.Point(366, 7);
VersionNoTB.Name = "VersionTB";
VersionNoTB.Size = new System.Drawing.Size(100, 20);
VersionNoTB.TabIndex = 2;
page.Controls.Add(ResizeButton);
page.Controls.Add(RemoveButton);
page.Controls.Add(VersionLabel);
page.Controls.Add(VersionNoTB);
page.Controls.Add(SerialNolabel);
page.Controls.Add(SerialNoTB);
page.Controls.Add(RegistersGrid);
page.Location = new System.Drawing.Point(4, 22);
page.Size = new System.Drawing.Size(716, 554);
page.TabIndex = 1;
page.UseVisualStyleBackColor = true;
page.Update(); // the following code fails
int k = dt.Columns.Count;
int l = RegistersGrid.ColumnCount;
for (int j = 0; j <= RegistersGrid.ColumnCount - 1; j++)
RegistersGrid.Columns[j].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
RegistersGrid.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
//datagrid has calculated it's widths so we can store them
for (int i = 0; i <= RegistersGrid.ColumnCount - 1; i++)
{
int colw = RegistersGrid.Columns[i].Width; //store autosized widths
RegistersGrid.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.None; //remove autosizing
RegistersGrid.Columns[i].Width = colw; //set width to calculated by autosize
}
}
}

How to find specific dynamic control and get value

I am making student attendance system. I am creating dynamic control and assigning values from database. Now I want to know how to find desired dynamic control and how I will get value from it.
I don't know how I can find desired control using a foreach loop.
This is my code for creating dynamic controls.
public void genControl(StudentAttendence sta)
{
StudentAttendenceBSLDAL stabd = new StudentAttendenceBSLDAL();
List<string[]> liName = stabd.takStudent(sta);
counts = Convert.ToInt16(stabd.takStudent(sta).Count);
for (int i=0; i< stabd.takStudent(sta).Count;i++)
{
for(int j = 0; j<liName[i].Count();j++)
{
Label lblStudentname = new Label();
Label lblStId = new Label();
lblStId.Name = "lblStId"+i.ToString()+j.ToString();
lblStudentname.Name = "liName"+i.ToString()+j.ToString();
lblStId.AutoSize = true;
lblStudentname.AutoSize = true;
if (j==0)
{
lblStId.Text = liName[i][j].ToString();
}
if(j==1)
{
lblStudentname.Text = liName[i][j].ToString();
}
lblStId.AutoSize = true;
lblStudentname.AutoSize = true;
if (i == 1)
{
lblStId.Location = new Point(41, 229);
lblStudentname.Location = new Point(153, 7);
}
else
{
lblStId.Location = new Point(3, 7 + 20);
lblStudentname.Location = new Point(153, 7 + 20);
}
this.Controls.Add(lblStId);
panel1.Controls.Add(lblStudentname);
}
CheckBox cba = new CheckBox();
cba.Name = "cba" + i.ToString() ;
cba.Text = "A";
cba.AutoSize = true;
CheckBox cbp = new CheckBox();
cbp.Name = i.ToString() ;
cbp.Text = "P";
cbp.AutoSize = true;
CheckBox cbl = new CheckBox();
cbl.Name = "cbl" + i.ToString() ;
cbl.Text = "L";
cbl.AutoSize = true;
if (i == 1)
{
cbp.Location = new Point(590, 3);
cba.Location = new Point(631, 3);
cbl.Location = new Point(670, 3);
}
else
{
cbp.Location = new Point(590, 3 + 23);
cba.Location = new Point(631, 3 + 23);
cbl.Location = new Point(670, 3 + 23);
}
panel1.Controls.Add(cbp);
panel1.Controls.Add(cba);
panel1.Controls.Add(cbl);
}
}
This is button control event in which I am trying to find control and get it value.
private void button2_Click(object sender, EventArgs e)
{
StudentAttendence sta = new StudentAttendence();
StudentAttendenceBSLDAL stabd = new StudentAttendenceBSLDAL();
// List<string[]> liName = stabd.takStudent(sta);
for (int i=0;i<counts;i++)
{
CheckBox cbP = panel1.Controls.OfType<CheckBox>().FirstOrDefault(b => b.Name.Equals("cbp"+i.ToString()));
// Label stid = panel1.Controls.Find("lblStId" + i.ToString(), false).First() as Label;
if(!cbP.IsChecked)
{
MessageBox.Show("control found");
}
}
}
You can save your control list into a SortedList.
You can use this sorted list for further processing

c# pass different variables to button onClick event

I would need different variables on button_Click event. For each button I need different billDetail and rowAmount values. Actually every button is giving the last values of the var Size.
I think is a easy problem but I'm doing this as hobby...please help me!
private void CashCounter_Load(object sender, EventArgs e)
{
var posXbutton = 120;
var posYbutton = 10;
var gapXbutton = 105;
var gapYbutton = 65;
var posXlabel = 5;
var posYlabel = 28;
var gapYlabel = 65;
using (var db = new GelatoProjectDBEntities())
{
#region working code
var items = (from x in db.ProductsLists
select new { x.Id, x.Product, x.Category, x.Size, x.Price, x.Market, x.Image }
).Where(x => x.Market == "Retail")
.ToArray();
var categories = (from x in items
select x.Category)
.Distinct();
foreach (var category in categories)
{
TabPage TabProduct = new TabPage(category);
TabProduct.BackColor = System.Drawing.Color.White;
tabControl1.TabPages.Add(TabProduct);
var products = (from i in items
where i.Category == category
select i.Product)
.Distinct()
.ToList();
foreach (var product in products)
{
string labelName = "label" + product;
var label = new Label();
label.AutoSize = false;
label.Location = new System.Drawing.Point(posXlabel, posYlabel);
label.Name = labelName;
label.Size = new System.Drawing.Size(110, 17);
label.TabIndex = 0;
label.Text = product;
label.RightToLeft = RightToLeft.Yes;
posYlabel = posYlabel + gapYlabel;
TabProduct.Controls.Add(label);
var sizes = (from i in items
where i.Product == product
//select i.Size)
select new { i.Id, i.Product, i.Category, i.Size, i.Price, i.Market, i.Image })
.Distinct()
.ToList();
foreach (var size in sizes)
{
BillDetail = size.Size+" "+product;
BillTotal = "£ "+size.Price;
RowAmount = size.Price;
string buttonName = "button" + product;
var button = new Button();
button.Location = new Point(posXbutton, posYbutton);
button.Name = buttonName;
button.Size = new Size(100, 50);
button.Text = size.Size;
button.BackColor = System.Drawing.Color.LightGray;
button.Click += new System.EventHandler(button_Click);
posXbutton = posXbutton + gapXbutton;
TabProduct.Controls.Add(button);
}
posXbutton = 120;
posYbutton = posYbutton + gapYbutton;
}
posXbutton = 120;
posYbutton = 10;
gapXbutton = 105;
gapYbutton = 65;
posXlabel = 5;
posYlabel = 28;
gapYlabel = 65;
}
}
#endregion
}
private void button_Click (object sender, EventArgs e)
{
ListViewItem NewBillProduct = new ListViewItem(BillDetail);
NewBillProduct.SubItems.Add("£");
NewBillProduct.SubItems.Add(RowAmount.ToString("F"));
listViewBillDetail.Items.Add(NewBillProduct);
BillTotalAmount = BillTotalAmount + double.Parse(RowAmount.ToString("F"));
ItemsTotal = ItemsTotal + 1;
textBoxTotal.Text = (BillTotalAmount.ToString("C", nfi)).ToString();
textBoxItems.Text = (ItemsTotal).ToString();
}
You can use Tag property of Button to store related Size object there:
button.Tag = size;
Then in click event handler you can retrieve this object:
private void button_Click (object sender, EventArgs e)
{
var button = (Button)sender;
var size = (Size)button.Tag;
// use size.Size or size.Price
// etc
}
Note: You can store several objects in Tag if you'll put them into array or list.

How to add values of 2 textboxes and check whether its equal to the third?

I have a form where I've multiple textboxes and a dropdown menu with it.
I want to calculate and check whether the sum of these textboxes is equal to third with each textbox has a dropdown menu along with it and the values of that dropdown menu are +1 or -1. For example, I have controls as following:
txt1 with ddl1; txt2 with ddl2; txt3 with ddl3; txt4 with ddl4;
I want to check whether:
txt1 * ddl1 = ((txt2 * ddl2) + (txt3 * ddl3) + (txt4 * ddl4))
Also, I am using a custom validator and want to check this condition in it.
Hope you need to change you textbox and ddl value to integer first.
int txt1 = Convert.ToInt32(TextBox1.Text);
int dd1 = Convert.ToInt32(DropDownList1.SelectedValue);
int txt2 = Convert.ToInt32(TextBox2.Text);
int dd2 = Convert.ToInt32(DropDownList2.SelectedValue);
int txt3 = Convert.ToInt32(TextBox3.Text);
int dd3 = Convert.ToInt32(DropDownList3.SelectedValue);
if (txt1 * dd1 == (txt2 * dd2) + (txt3 * dd3))
{
//YOur code here
}
function Total() {
var sumofall;
var FirstText = document.getElementById('txt1').value;
var SecondText = document.getElementById('txt2').value;
var ThirdText = document.getElementById('txt3').value;
var FouthText = document.getElementById('txt4').value;
var dropdown = document.getElementById("ddl1");
var dropdown2 = document.getElementById("ddl2");
var dropdown3 = document.getElementById("ddl3");
var dropdown4 = document.getElementById("ddl4");
var value = dropdown.options[dropdown.selectedIndex].value;
var value2 = dropdown2.options[dropdown2.selectedIndex].value;
var value3 = dropdown3.options[dropdown3.selectedIndex].value;
var value4 = dropdown4.options[dropdown4.selectedIndex].value;
var text = dropdown.options[dropdown.selectedIndex].text;
var text2 = dropdown2.options[dropdown2.selectedIndex].text;
var text3 = dropdown3.options[dropdown3.selectedIndex].text;
var text4 = dropdown4.options[dropdown4.selectedIndex].text;
if (FirstText == "")
FirstText = 0;
if (dropdown == "")
dropdown = 0;
var result = parseInt(FirstText) * parseInt(text);
if (!isNaN(result)) {
}
if (SecondText == "")
SecondText = 0;
if (dropdown2 == "")
dropdown2 = 0;
if (ThirdText == "")
ThirdText = 0;
if (dropdown3 == "")
dropdown3 = 0;
if (FouthText == "")
FouthText = 0;
if (dropdown4 == "")
dropdown4 = 0;
var result2 = parseInt(SecondText) * parseInt(text2);
var result3 = parseInt(ThirdText) * parseInt(text3);
var result4 = parseInt(FouthText) * parseInt(text4);
if (!isNaN(result2) && !isNaN(result3) && !isNaN(result4)) {
sumofall = result2 + result3 + result4;
}
if (result == sumofall)
alert('Something');
else
alert('Error..Not Matched');
return false;
}
In the server function of the custom validator you can write:
int firstValue = 0;
if(int32.TryParse(txt1.Text), out firstValue)
{
int secondValue = 0;
if(int32.TryParse(txt2.Text), out secondValue)
{
// ...
// check other value, then
arg.IsValid = firstValue * Convert.ToInt32(ddl1.SelectedValue) ==
(secondValue * Convert.ToInt32(ddl2.SelectedValue)) +
(thirdValue * Convert.ToInt32(ddl3.SelectedValue)) +
(fourthValue * Convert.ToInt32(ddl4.SelectedValue));
}
else
lblEsito = "Il valore nel secondo TextBox non è un intero";
}
else
lblEsito = "Il valore nel primo TextBox non è un intero";
I have supposed values of dropdownlists are integer and any "Select" with value "0" or "" is present in the dropdownlist controls.
Next time you have to post some code.

how to save data from dynamic textbox?

this code creates a textbox dynamically based on the total number of items in a listview. my problem is how can i access these textboxes so i can save the contents of the textbox to my database?
int f = 24;
int j = 25;
for (int gg = 0; gg < listView1.Items.Count;gg++ )
{
j = f + j;
TextBox txtb = new TextBox();
txtb.Name = "tboxl1"+gg;
txtb.Location = new Point(330,j);
txtb.Visible = true;
txtb.Enabled = true;
txtb.Font = new Font(txtb.Font.FontFamily,12);
groupBox2.Controls.Add(txtb);
}
I'd be more inclined to write you code like this:
var f = 24;
var j = 25;
var textBoxes =
Enumerable
.Range(0, listView1.Items.Count)
.Select(gg =>
{
j = f + j;
var txtb = new TextBox();
txtb.Name = String.Format("tboxl1{0}", gg);
txtb.Location = new Point(330, j);
txtb.Visible = true;
txtb.Enabled = true;
txtb.Font = new Font(txtb.Font.FontFamily, 12);
return txtb;
})
.ToList();
textBoxes.ForEach(txtb => groupBox2.Controls.Add(txtb));
Now you have a variable textBoxes that saves references to the new text boxes. You can use that to get the values from the text boxes to save them to your database.
If you want all TextBox controls then:
foreach (Control control in groupBox2.Controls)
{
if (control is TextBox)
{
string value = (control as TextBox).Text;
// Save your value here...
}
}
But if you want a specific TextBox, you can get it by its name like this:
Control control = groupBox1.Controls.Find("textBox1", false).FirstOrDefault(); // returns null if no control with this name exists
TextBox textBoxControl = control as TextBox; // if you want TextBox control
string value = control.Text;
// Now you can save your value anywhere
You can get the reference to text box as follows,
Control GetControlByName(string Name)
{
foreach(Control c in this.Controls)
if(c.Name == Name)
return c;
return null;
}

Categories