|
If you throw an exception when input is invalid you can use Parse instead
|
|
|
|
|
If you think the problem is DevExpress related, try their (excellent) support forums.
public bool TryGetDigits(string str, out int iresult)
{
StringBuilder sb = new StringBuilder
(
new string(str.Where(ch => Char.IsDigit(ch)).ToArray())
);
if (Int32.TryParse
(
sb.ToString(),
out iresult)
)
{
return true;
}
return false;
} usage:
int iresult = 0;
bool gotSomeDigits = TryGetDigits("2ergtgwegwg1", out iresult);
if (gotSomeDigits )
{
}
else
{
}
«The mind is not a vessel to be filled but a fire to be kindled» Plutarch
|
|
|
|
|
I'm not sure why you've got the StringBuilder in there? You've already created the string you need and passed it into the constructor.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Richard Deeming wrote: I'm not sure why you've got the StringBuilder in there? Because little embroidered habanera peppers on old blue jeans is ... intriguing ?
«The mind is not a vessel to be filled but a fire to be kindled» Plutarch
|
|
|
|
|
Hi.
I use C# in Visual Studio and SQL Server. In my form I have a label that receives the name of a bank and a Textbox that must be filed with the bank balance. This couple repeats for the number of bank accounts of the client. After I retrieve the balances, I use the following snipet:
if (TabSaldo.Rows.Count > 0)
{
for (i = 0; i < Nbancos; i++)
{
foreach (Control c1 in Gb_Bancos.Controls)
{
if (c1.Name.Contains("Lb_Banco" + (i + 1).ToString()))
c1.Text = LinhaSaldo[i].ItemArray[1].ToString();
if (c1.Name.Contains("Tb_Banco" + (i + 1).ToString()))
{
c1.Text = LinhaSaldo[i].ItemArray[2].ToString();
TotalBancos += float.Parse(LinhaSaldo[i].ItemArray[2].ToString()) / 100;
}
}
}
}
It's working fine, but when I make the conversion from string to float (line starting with (TotalBancos +=) the conversion ignores the decimal point. Example: if the balance is 113,54 it sums 11354. As you see, I had to include a division by 100, for it to work. Please does anyone know what is wrong here?
Thanks.
|
|
|
|
|
Why are you converting something to a string in order to parse it to a float?
Either it's a string to start with - in which case it's a waste of time and looks like the coder didn't know what he was doing - or it is a numeric value already - in which case why are you trying to parse it at all?
If I try to abstract your code:
float tb = 0.0F;
tb += float.Parse("666.66") / 100;
Console.WriteLine(tb);
Then I get what I expected: 6.6666 so there are a couple of possibilities:
1) LinhaSaldo[i].ItemArray[2] is not the value you expect it to be.
2) TotalBancos is not a floating point variable.
We can't check either of those so, it's going to be up to you.
Fortunately, you have a tool available to you which will help you find out what is going on: the debugger. If you don't know how to use it then a quick Google for "Visual Studio debugger" should give you the info you need.
Put a breakpoint on the first line in the function, and run your code through the debugger. Then look at your code, and at your data and work out what should happen manually. Then single step each line checking that what you expected to happen is exactly what did. When it isn't, that's when you have a problem, and you can back-track (or run it again and look more closely) to find out why.
Sorry, but we can't do that for you - time for you to learn a new (and very, very useful) skill: debugging!
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi, OriginalGriff.
I use debugging and the values retrieved are correct. The line
LinhaSaldo[i].ItemArray[2]
is used because of the code:
DataTable TabSaldo = Banco.LeSaldoBanco(Dtp_DataSaldo.Text);
DataRow[] LinhaSaldo = TabSaldo.Select(null, null, DataViewRowState.CurrentRows);
In this code I retrive data from the database and LinhaSaldo is used to access the data. The only form to do this that I know is by doing:
c1.Text = LinhaSaldo[i].ItemArray[2].ToString();
I've put messages to show me the retrieved values and they are OK, but after the line above, they are multiplied by 100. In other words, the decimal point was ignored. I´v tried many things, but none works. I also executed the program step by step, but nothing.
If you have any suggestion, I would apprecciate it.
|
|
|
|
|
You should not use float or double types in financial applications, as they can lose precision. Use the Decimal type or convert all values to the smallest denomination (cents etc.) and use integers..
|
|
|
|
|
Richard.
I changed the types. Thanks for your help.
|
|
|
|
|
Could, in addition to the ideas from the other respondents, be a culture thing. In some cultures, ',' is a thousands separator so your 113,54 could be treated as a misplaced thousands separator and assumed to be 11,354 which is 11354. If in your culture ',' is a decimal separator (which I am guessing is why you are dividing by 100 to get 113.54 [using my locale's decimal separator]) and your program is not using the same culture then it will misinterpret the value.
See, for example, c# - float.Parse() doesn't work the way I wanted - Stack Overflow[^]
See, for example, Single.Parse Method (System) | Microsoft Docs[^] (I know this is for single, rather than for float; but they work the same way and the version for float is playing hide-and-seek).
|
|
|
|
|
Hi, jsc42.
I tried what you suggested and it aparently works.
Thanks.
|
|
|
|
|
Hello.
I'm programming in C# with Visual Studio using forms.
I have a form with 8 textboxes, inside a groupbox. Depending on the data I retrieve from a database, I need to make some of them invisible. So, at running time I have to make them invisible. The names of the Textboxes are Tb_1, Tb_2 an so on. For example, if I retrive the number of fields as 6, I must make 2 of them invisible (the last 2). Can anybody help me do this?
Thanks.
|
|
|
|
|
|
To add to what Gerry has said, you can set the visibility without knowing the names, provided they are added to the GroupBox in the right order (you can reorder them by editing the myCodeFile.designer.cs file carefully):
int tbNo = 0;
foreach (control c in MyGroupBox.Controls)
{
if (c is TextBox tb)
{
tb.Visible = tbNo++ < numberYouWantToSee;
}
}
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi OriginalGriff.
I think your solution works fine. Thank you.
|
|
|
|
|
A better design is to make them disabled (control.enabled = false) instead of playing with the visibility. Then you avoid having controls in different places or holes in your form.
Never underestimate the power of human stupidity -
RAH
I'm old. I know stuff - JSOP
|
|
|
|
|
A generalization. Nothing wrong with collapsing part of the UI if it provides more real estate where it's needed and wanted depending on the context. You just need a (anchor) "plan" that doesn't disorient. No different than toggling ribbons, toolbars, menus, popups and the like.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
Of course it is a generalisation but disabling is still generally the accepted solution. If real estate is such a problem then introduce the OP to tabs!
Never underestimate the power of human stupidity -
RAH
I'm old. I know stuff - JSOP
|
|
|
|
|
Hi,
In the past I've dealt with this issue (UI holes) in different ways, depending on layout; in a TableLayoutPanel, you can hide rows or columns by setting width or height to #0.
In a Panel, docking can be used to resize visible controls when other controls are hidden: accordion style controls are easily created.
I don't think the OP here needs these techniques, or, I'd post an example.
Depending on context, and end-user, a "hole" may be better than "pretty" ... its "absence" can convey information.
«The mind is not a vessel to be filled but a fire to be kindled» Plutarch
|
|
|
|
|
Hi,
The following code causes error when the active sheet has a name other than "DataSet1". I want to handle errors in these codes:
IWorkbook workbook = spreadsheetControl.Document;
Worksheet worksheet = workbook.Worksheets.ActiveWorksheet;
try
{
spreadsheetControl.Invoke((MethodInvoker)delegate { workbook.Worksheets.ActiveWorksheet = workbook.Worksheets["DataSet1"]; });
}
catch (ArgumentOutOfRangeException ex)
{
MessageBox.Show(ex.ToString());
return;
}
But, there is runtime error inside Try block that says:
Quote: System.ArgumentOutOfRangeException: 'Worksheet with this name is not found.
How can I control error handing in this situation?
modified 31-Jul-21 23:07pm.
|
|
|
|
|
Don't use hard coded sheet names. Use the relevant Workbook method to find the names of the Worksheets within it.
|
|
|
|
|
Hi,
I want to handle error when there is no CreateTable.sql script file in the defined path by giving an alarm in MessageBox.
if (!File.Exists(databaseName))
{
using (SQLiteConnection sqliteCon = new SQLiteConnection(@"Data Source = " + databaseName))
{
sqliteCon.Open();
try
{
string dbCreationScript = File.ReadAllText(@"CreateTable.sql");
}
catch (Exception)
{
MessageBox.Show("Script file not found");
}
SQLiteCommand cmd = new SQLiteCommand();
cmd.CommandText = dbCreationScript;
cmd.Connection = sqliteCon;
cmd.ExecuteNonQuery();
sqliteCon.Close();
}
}
dbCreationScript is out of current context.
How can I control error handling for CreateTable.sql script file?
Variables declared inside Try/Catch block are out of scope.
modified 31-Jul-21 5:22am.
|
|
|
|
|
You can't "pass" a variable - any variable - from inside a scope to outside it: that is what scope is there for!
What that means is that if you declare a variable inside a pair or curly brackets, it is available to all code within those brackets (including nested blocks of code with their own curly brackets) but at the closing curly bracket of the block the variable ceases to exist and can no longer be accessed.
You would have to move the creation of the variable outside the try...catch block in order to use it.
But ... that code is pretty bad:
1) Never, ever create empty catch blocks. All that does is hide the error from running code until it's too late to do anything about it, and throw away all the information you as the developer need to fix the problem when you test it!
At a bare minimum, provide a Exception variable and log it to the Debug stream:
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
} This give you the developer a warning that it happened, and provides the exception detail for you to look at with the debugger.
2) The try block should cover the whole operation, right up to and including the ExecuteNonQuery - because if an error is going to occur with the data you are reading from your file, that's where it will happen!
3) You don't need to close the connection: the end of the using block will do that.
4) Don't hardcode filenames! Use a variable (or const ) so you only have to change it in one place!
5) Don't store your data in the application folder! That generally fails in production becasue teh app folder is write protected ...
See here: Where should I store my data?[^] for some better ideas.
So try it like this:
if (!File.Exists(databaseName))
{
using (SQLiteConnection sqliteCon = new SQLiteConnection(@"Data Source = " + databaseName))
{
sqliteCon.Open();
string dbCreationScript = null;
try
{
dbCreationScript = File.ReadAllText(pathToFile);
using (SQLiteCommand cmd = new SQLiteCommand())
{
cmd.CommandText = dbCreationScript;
cmd.Connection = sqliteCon;
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
How about declaring the
string dbCreationScript outside the try block?
|
|
|
|
|
Hi.
I'm using C# in Visual Studio and I installed the ItextSharp package to deal with PDF files. It's working fine. My problem is that when I instaled the executable file in anothe machine, it showed an error when I tried to generate a PDF file. I think the problem is that I didn't copy files for the itextSharp. Can anybody tell me which files I should copy to solve the problem?
Thanks.
|
|
|
|