|
Not a hard-and-fast rule, but I have often found that if I need an out or ref parameter, it indicates that my object model might be wrong.
Of course, it's not always easy, or possible, to get that entirely as you would like it, due to the interfaces that need to be used.
However, as perhaps a poor example (since you admit your example isn't the best), instead of:
public bool IsProductOnSale(guid productId, out Guid[] productResellerIds)
{
}
maybe you would consider having "Product" objects, instead of using a raw id. This could then contain all the information you need, and/or look it up as-and-when required:
e.g:
class Product
{
private Collection<Seller> resellers;
public Collection<Seller> Resellers
{
if (null == resellers)
{
}
return resellers;
}
public bool IsProductOnSale()
{
return (Resellers.Count > 0);
}
}
Then you could do
if (myProduct.IsProductOnSale) { foreach (Seller in myProduct.Resellers) { ... }
without obtaining the information from the database twice. Your calling code doesn't even need to know how (or when) the information is retrieved - you might decide to do it in the constructor.
Your constructor for Product would probably take a guid... etc, etc.
|
|
|
|
|
Thanks for the input. I have classes similar to your Product , which wrap up data from a database into an object to be used by other functions. With my example, the idea I was working with is that here is a function that connects to the database and retrieves data that can change any time (e.g. Product). I also have data that changes infrequently and can be kept in memory and is periodically refreshed (e.g. Reseller). Would it make sense to fetch a result set of variable data and use the out parameter to contain related persistent data that you already have? Or would it be better to break this into two or three other functions for each step?
if (Object.DividedByZero == true) { Universe.Implode(); }
Meus ratio ex fortis machina. Simplicitatis de formae ac munus. -Foothill, 2016
|
|
|
|
|
I have a simple winform (C#) with a text box and a button.
My requirement is that while the button is clicked the text box content should be added with "Some message". As long the button is in clicked status the message in text box should be kept on adding.
The moment I let go the button (remove my finger off the mouse), this adding message to text box should stop.
Is there a while clicked loop possible in a button click event ?
|
|
|
|
|
Timer, set to 10ms interval
Set the text box text based on whether the button is clicked currently
|
|
|
|
|
Do you want to keep the message posted when there is button pressed, as soon as you release the button it should stop posting right ?
The click event will not help you anymore here, cause click is the combination of 'keyPress' and 'keyUp' event
you need to handle both events, on 'keyPress' post the message in textbox and on 'keyUp' event stop posting
hope it helps
Find More .Net development tips at : .NET Tips
The only reason people get lost in thought is because it's unfamiliar territory.
|
|
|
|
|
Don't you mean MouseDown and MouseUp?
|
|
|
|
|
Oooops big typo.
Yes, I mean MouseUp and Down event with timer will accomplish his task
Find More .Net development tips at : .NET Tips
The only reason people get lost in thought is because it's unfamiliar territory.
|
|
|
|
|
Don't use a Timer. Use the methods on the Button MouseDown to start the update and MouseUp to stop the update.
You should probably do the updating on a separate Thread ... this CodeProject article can be adapted to do what you want - Simple Threading[^]
For example I have a button btnDemo - when I hold it "down" with my mouse a label lblDemo will get a number displayed. When I release the button then the label will get the text "stopped"...
Here is the code that handles the mouseclicks on the button
private void btnDemo_MouseDown(object sender, MouseEventArgs e)
{
demoThread = new Thread(ThreadProcSafe);
btnDemo.Text = "Stop Demo";
demoThread.Start();
}
private void btnDemo_MouseUp(object sender, MouseEventArgs e)
{
if (!stopDemo)
{
stopDemo = true;
if (!demoThread.Join(1000))
{
demoThread.Abort();
}
SetText("Stopped");
btnDemo.Text = "Start Demo";
}
} And here is the code that actually sets up the thread and SetText functons (with some very basic error handling). These are the bits you need to change to put your message in your TextBox
delegate void SetTextCallback(string text);
private Thread demoThread;
private volatile bool stopDemo;
private void ThreadProcSafe()
{
var x = 0;
while (!stopDemo)
{
SetText((x++).ToString());
Thread.Sleep(600);
}
}
private void SetText(string text)
{
try
{
if (lbl_right.Disposing) return;
if (lblDemo.InvokeRequired)
{
var d = new SetTextCallback(SetText);
BeginInvoke(d, text);
}
else
lblDemo.Text = text;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
If you read the article it points out that sometimes the threads won't close properly when you attempt to close the application. Because we have the thread starting on a mouse down and ending on the mouse-up this is less likely but still worth adding this method into the form -
protected override void OnClosed(EventArgs e)
{
stopDemo = true;
if (!demoThread.Join(1000))
{
demoThread.Abort();
}
base.OnClosed(e);
}
|
|
|
|
|
Fantastic CHill60.
Thank you ! Your tip works like a miracle. !!
Cheers !!
|
|
|
|
|
Wish I could claim the credit - if that article by loneferret helped you then be sure to give it an up-vote
|
|
|
|
|
|
I am updating my all in one IServiceProvider IoC container.
Previously I was only accessing public type, public constructors, public properties.
Now I am also checking private stuff.
Now when I run my console app.
Assembly a;
a.DefinedTypes
Work fine and I can enumerate them and instantiate them. Whether or not they are private type.
But I suspect there are circumstance where this utility class won't be working.. In fact my .NET security is... tenuous... but you could reduce the right of a piece of code...
How to check whether or not I can do those private reflective operation or not?!
When Can't I do them?
|
|
|
|
|
Im very new to C# and am trying to use conversion tools to change some VB over. Im not quite sure how to remedy this error, so any help I can get is greatly appreciated!
This is the error Im receiving:
"CS0266: Cannot implicitly convert type 'System.Web.UI.Control' to 'System.Web.UI.WebControls.LinkButton'. An explicit conversion exists (are you missing a cast?)"
for Line 93
myDeleteButton = myTableCell.Controls[0];
Here is the full C# code:
public void Page_Load(object Source, EventArgs E)
{
if (!Page.IsPostBack)
{
BindData();
}
}
public void BindData()
{
DataSet myDataSet = new DataSet();
SqlDataAdapter mySqlDataAdapter = default(SqlDataAdapter);
mySqlDataAdapter = new SqlDataAdapter("SELECT * FROM glmaster", "REMOVED;");
mySqlDataAdapter.Fill(myDataSet, "glmaster");
glmasterInfo.DataSource = myDataSet.Tables["glmaster"];
glmasterInfo.DataBind();
}
public void DataGrid_Delete(object Source, DataGridCommandEventArgs E)
{
SqlConnection myConnection = default(SqlConnection);
SqlCommand myCommand = default(SqlCommand);
string strDeleteStmt = "";
decimal balance_test = new decimal();
string Balance_output = "";
balance_test = System.Convert.ToDecimal(Convert.ToDecimal(E.Item.Cells[6].Text));
if (balance_test == 0.0M)
{
outError.InnerHtml = "";
strDeleteStmt = "DELETE FROM glmaster " +
" WHERE major = " + E.Item.Cells[1].Text +
" AND minor = " + E.Item.Cells[2].Text +
" AND sub1 = " + E.Item.Cells[3].Text +
" AND sub2 = " + E.Item.Cells[4].Text;
try
{
myConnection = new SqlConnection(
"REMOVED;");
myCommand = new SqlCommand(strDeleteStmt, myConnection);
myConnection.Open();
myCommand.ExecuteNonQuery();
glmasterInfo.EditItemIndex = -1;
BindData();
}
catch (Exception exc)
{
outError.InnerHtml = "* Error while deleting data.<br />"
+ exc.Message + "<br />" + exc.Source;
}
finally
{
myConnection.Close();
}
}
else
{
Balance_output = balance_test.ToString("C");
string Error_String = "";
Error_String = "<center>You Can\'t Delete This Account<br>";
Error_String = Error_String + "Balance is NOT zero.<br>";
Error_String = Error_String + "The Account Balance is " + Balance_output;
Error_String = Error_String + " for ";
Error_String = Error_String + E.Item.Cells[1].Text + "-";
Error_String = Error_String + E.Item.Cells[2].Text + "-";
Error_String = Error_String + E.Item.Cells[3].Text + "-";
Error_String = Error_String + E.Item.Cells[4].Text + "</center>";
outError.InnerHtml = Error_String;
}
}
public void DataGrid_ItemCreated(object Sender, DataGridItemEventArgs e)
{
if (((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem)) || (e.Item.ItemType == ListItemType.EditItem))
{
TableCell myTableCell = default(TableCell);
myTableCell = e.Item.Cells[0];
LinkButton myDeleteButton = default(LinkButton);
myDeleteButton = myTableCell.Controls[0];
myDeleteButton.Attributes.Add("onclick", "javascript: return confirm(\'Are you Sure you want to delete this account?\');");
}
}
modified 19-Apr-16 11:29am.
|
|
|
|
|
It would really help us to help you if you actually indicated (with a comment) where the error occurs.
|
|
|
|
|
sorry about that. Line 93
myDeleteButton = myTableCell.Controls[0];
|
|
|
|
|
Please edit your original question and add the information there, so anyone else reading the question can see the details.
|
|
|
|
|
|
Your first suggestion worked perfectly! Thanks so much for your help
|
|
|
|
|
|
Ill be sure to work on it. Thanks
|
|
|
|
|
I have created a windows File watcher Service which works fine on Development PC but when i am trying to install and start in other PC , it throws an error
Windows could not start the {name of service} service on Local Computer. Error 1067: The process terminated unexpectedly.
Please help
|
|
|
|
|
Means there has been an exception that you did not handle, or that there was no work. Does the folder that you are watching exist? Does the service (that runs under different credentials than the user) have the correct rights to access that directory?
Open the services, locate yours, right-click and change the user under which it runs to your account.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
I am new to UWP, so please forgive me!
I have been trying to implement a TCP Server \ Client, as outlined in the Microsoft example:
[^]
If I try this out on my local machine, it works fine (app generates server & client). If I then try on my remote machine (Minnowboard Turbot), I dont get a connection, or receive any data.
I have also tried (from both Local & Remote machine) connecting to a TCP Server program that I already have written. Whilst I get a connection to the server, I dont receive any data from the server (which is sending data every second).
Does anyone know what mistake I am making?
Thanks for any advice
Mike
|
|
|
|
|
Such problems are usually sourced by firewalls filtering out the data packets.
You must configure the local Windows firewall for the system running the server process to accept incoming packets on the listening port.
If the systems are not in the same subnet (local network), it may be also necessary to allow the same packets on the firewall of the server side (e.g. a router).
|
|
|
|
|
Hi Jochen, thanks for your help!
I have had a little more success. In the project capabilities, I just had Private Networks (Client & Server) ticked. I have now ticked Internet (Client & Server), and my test project is now able to send & receive data on both the local & remote machine (to itself (ie app is client & server)). If I create 2 projects - one server, one client and run one on the Local & one on the Remote, it can now connect, Send & Receive in either direction.
If I then try to connect my Client to my Original Server (written Visual studio C# 2010), I can connect from my Client and send data (from Client to Server). I DO NOT however receive any data from my Server to my client. This is the same for either the Local or Remote machines.
I have just fired up Wireshark, and this does see the Server Sent client.
My Client Code is this:
private async void CreateClient()
{
try
{
socket = new Windows.Networking.Sockets.StreamSocket();
Windows.Networking.HostName serverHost = new Windows.Networking.HostName("192.168.1.19");
string serverPort = "7001";
await socket.ConnectAsync(serverHost, serverPort);
Stream streamIn = socket.InputStream.AsStreamForRead();
streamIn.Flush();
StreamReader reader = new StreamReader(streamIn);
while (true)
{
string response = await reader.ReadLineAsync();
}
}
catch (Exception e)
{
}
}
Has anyone any suggestions?
Thanks
Mike
|
|
|
|