|
i have created a list view and have ways to put in information, edit it, and delete one at a time. But i cannot get it to delete more than one at a time. My code is:
if (listView1.SelectedItems.Count > 1)
{
int SelectedItemCount = listView1.SelectedItems.Count;
int usableSelectedItemCount = SelectedItemCount - 1;
if (MessageBox.Show("Are you sure you want to delete these " + SelectedItemCount + " items?", "Confirm Delete",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, 0) == DialogResult.Yes)
{
for (int Removed = 0; Removed < usableSelectedItemCount; Removed++)
{
listView1.Items.Remove(listView1.SelectedItems[Removed]);
}
}
else if (listView1.SelectedItems.Count == 1)
{
if (MessageBox.Show("Are you sure you want to delete?", "Confirm Delete", MessageBoxButtons.YesNo,
MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, 0) == DialogResult.Yes)
{
listView1.Items.Remove(listView1.SelectedItems[0]);
}
}
Did i mess up by approaching the for loop incorrectly? What can i do to fix it?
Thanks for the help.
(and sorry about the long code)
|
|
|
|
|
This code might help you...
if (listView1.SelectedItems.Count > 0)
{
int SelectedItemCount = listView1.SelectedItems.Count;
int usableSelectedItemCount = SelectedItemCount - 1;
if (MessageBox.Show("Are you sure you want to delete these "
+ SelectedItemCount + " items?",
"Confirm Delete", MessageBoxButtons.YesNo,
MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button2, 0) == DialogResult.Yes)
{
foreach (ListViewItem item in listView1.SelectedItems)
{
listView1.Items.Remove(item);
}
}
else if (listView1.SelectedItems.Count == 1)
{
if (MessageBox.Show("Are you sure you want to delete?",
"Confirm Delete", MessageBoxButtons.YesNo,
MessageBoxIcon.Warning,
MessageBoxDefaultButton.Button2, 0) == DialogResult.Yes)
{
}
}
}
Look at the if condition for greater than one.
Jayant D. Kulkarni
Brainbench Certified Software Engineer in C#, ASP.NET, .NET Framework and ADO.NET
|
|
|
|
|
How can I get a reference of the calling Assembly at Runtime?
I've an assembly (RestrictedAssembly) and I want to ristrict access to it means no user who fullfills my criteria (in my case not having my desired public key token for assembly) can instantiate any type from my assembly.
For better understanding, this is what I am trying to do.
I've generated a public/private keypair file for myself, then I use it to sign all those assemblies which I want to allow Access to my RestrictedAssembly. On Runtime before instantiating any type from RestrictedAssembly, in constructor I am asking the caller to provide a Type object from which he's initiating a call to constructor. For example.
public RestrictedType1(Type o) {
Type t = this.GetType ();
byte [] t1Token = o.Assembly.GetName().GetPublicKeyToken();
byte [] t2Token = t.Assembly.GetName().GetPublicKeyToken();
AccessNotAllowedEx ex = new AccessNotAllowedEx("Not Allowed");
if(t1Token != null && t2Token != null) {
if(t1Token.Length == t2Token.Length) {
for(int i = 0; i< t1Token.Length; i++) {
if (t1Token[i] == t2Token[i])
continue;
else
throw ex;
}
ex = null;
} else
throw ex;
} else
throw ex;
}
I am checking, if the public key tokens for both the calling and called assemblies are identical and if they are, then I am allowing the caller to instantiate my RestrictedType other wise I raise an exception.
Now the problem with this approach is that, suppose I've an Assembly CallerOfRestrictedAssembly and I've signed it with my public/private key pair. Now from CallerOfRestrictedAssembly it is valid to do the following. Since both assemblies have same public key token.
RestrictedType1 res = new RestrictedType1(this.GetType);
However, suppose if some one initiate a call to RestrictedType1 constructor
RestrictedType1 res = new RestrictedType1(typeof(TypeFromCallerOfRestrictedAssembly));
This will cheat the constructor. Thus, I don't want caller to Pass Type argument into Constructor. and depend on it. What I am looking for is to get a reference of Calling Assembly into my RestrictedAssembly at Runtime?
I'll apreciate if some can help with this or any other approach to achieve this level of code restriction? Thanks.
SMK
|
|
|
|
|
Please don't cross post.
---
It's amazing to see how much work some people will go through just to avoid a little bit of work.
|
|
|
|
|
Syed Muhammad Kamran wrote: How can I get a reference of the calling Assembly at Runtime?
You mean something like Assembly.GetCallingAssembly() method?? Don't forget to reference the System.Reflection namespace.
PS.
Even this got ways to be cracked with.
Regards
|
|
|
|
|
There are ways to even crack this.....
You mean like this??
Assembly asm = Assembly.GetAssembly ( Type ( MyRestrictedAssembly ) );
byte[] b = asm.GetName ().GetPublicKey ();
this.GetType ().Assembly.GetName ().SetPublicKey ( b );
TypeFromRestrictedAssembly temp = new TypeFromRestrictedAssembly ( this.GetType ().Assembly );
SMK
|
|
|
|
|
Well, not exactly. You can crack it using MSIL dissassembler. Just disassemble the code, copy/paste it, or remove the few lines that check for the calling assembly and save the dll files. Yes, it isn't that easy, but it's still doable. If you are not expecting hardcore persistant crackers to hut your application, it would be a nice way of protecting someone from using your code by referencing. Another way to protect your program from being used by reflection also could be the Dotfuscator. It's a small freeware tool to obfuscate your cde against disassembling. Still crackable, but a bit harder.
Regards
|
|
|
|
|
using TcpClient, i have made a client Server chat application. Server is running on another computer. in Client side i use the server IP address and PORT number to connect. If the server is running Any Computer the Client should automatically find the server Ip address how it is possible?
//
now i am using like this
Client Side
TcpClient tcp=new TcpClient();
tcp.Connect("192.0.0.3",8888);
//
Sanjit.rajbanshi@wlinktech.com
|
|
|
|
|
You would need to broadcast to all the machines on the network and the machine running the server could send back a reply and you can connect to it.
It is similar to how your DHCP works.
Tarakeshwar Reddy
MCP, CCIE Q(R&S)
|
|
|
|
|
I'm setting up an authentication system for access to a server through a remoting layer.
Using custom channel sinks to do this doesn't seem to be a problem.
The problem is that if someone is authenticated as, say "bob" within the remoting layer, then the remote object also needs to know that the method was called by "bob".
Is there any way to pass extra information like this from the remoting layer to the application layer without it being a parameter of the remote method called? Some sort of shared remoting context object, or the like?
|
|
|
|
|
|
|
Unfortunately you can't call assembly code directly from managed code. There is one workaround I can think of; That is to put your assembly code in a C++ -whether managed or not- dll library and call it from your C# code.
In your C++ project you can put your assebly as inline -but IIRC this doesn't allow interrupts to be called-, or put it as an asm file and link it with your project. I did that sometime ago and it worked.
Regards
|
|
|
|
|
can you please explain me in depth.
nishu
|
|
|
|
|
Forgive me if my reply was too shallow.:-> I'll try to fill you with more details, but forgive I still got to be breif as there are too much details that I can't cover in one post.
Now, the interrupts you are talking about are in Assembly code which is a very low level language very close to machine code. These are some sort of a very low level functions that are hardcoded in the processor. Some sort of a processor specific API that should be called at the lowest level of programming... The machine code.
Before the DotNet emergance, all exe files were in assembly/machine code. Every compiler was to compile any code into assembly/machine code. Now in DotNet the compiler actually compiles you code into MS Intermediate Language, which is not machine code. When you double click a DotNet exe file, the DotNet framework actually does the compilation into the machine code in the memory. This is called JIT -Just In Time- compilation. Why did they do that?? It's quite long to say.
The assembly language itself has something similar to a compiler that is called assembler, in which you could write your assembly code directly and convert it to exe file. When C++ emerged they made a feature in MS C++; That is to write assembly code either within your C++ code in asm blocks -something like the unsafe, or try blocks of C#-. Ans Since they all will turn into machine code in the end, it didn't really matter. Yet using this method -i.e. inline assembly block-, didn't support interrupt calls -remember, interrupts are like functions hardcoded in the processor-.
The other way is to write your assembly code as you would in an assembler. Put it in a asm file, and link -something like referencing- that asm file in your C++ project. This was the way if you want to write large code blocks in assembly, and keep the main bulk of your program in C++. Again all the .cpp and .asm file wil be mixed up in one big .exe file written in machine code.
Now, in C# that is not possible. As your C# code is converted it MSIL language which is different that the conventional machine code. So you can't mix up assembly with MSIL...
Oh!! And sorry! You can't call BIOS interrupts in any other language than assembly.
PS.
This is a forum post. All the info above were ment to be as accurate as possible, but I had to omit a lot of details -Yes I did... Don't ROTFL-. So any inaccuracy in the info was not meant, and anyone is welcomed to explain/correct any mistake.
Regards
|
|
|
|
|
you gave very deeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeep
info..I wanted to know the libraries that can be used to create c++ dll files coz you had done this before.
anyway thanx for your deeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee....................................................................................................................................................................................................p information
nishu
|
|
|
|
|
Your welcome.
You don't need any special libraries to make a C++ library. You can make an MFC library and do as I said. The way I did it was to make an empty project totally from the scratch. and change the compile output to dll. This had more work to do, but give you more control -also the way to do it in MFC gave me headache-. I'll look in my HDD for that old project. If I find it I'll give you more details. There were some compiler options that had to be set -I don't remember them right now-.
PS.
Do you know how to program in Assembly language?
Regards
|
|
|
|
|
at first i tried using methods, like Change(string name), but it didn't work across forms. How would i go about transfering this information?
Thanks.
|
|
|
|
|
You can pass information via the constructor to the other form
<br />
Form2 objForm = new Form2(Param1, Param2);<br />
objForm.Show();
Is this what your asking for?
Tarakeshwar Reddy
MCP, CCIE Q(R&S)
|
|
|
|
|
The best way is to create delegates between the forms. The methods probably didn't work because you were not calling them on the same instance of the form as the one you had in use. Delegates will give you the same problem, but it's easier to hook up delegates than track form instances.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
|
|
|
|
|
Hi all,
I have a drop down control which let the user to select for auto create number of textbox control into the form. Once it generate the textboxes, I check the view source for each of the textbox control with _ctl0, _ctl1 ..... added on in front of the textbox id. I need to get those value and insert into the DB. Here is my code behind.
private void btnMulitTextBox_Click(object sender, System.EventArgs e)
{
SqlConnection conn = ....;
conn.Open();
cmd = new SqlCommand("....", conn);
cmd.CommandType = CommandType.StoredProcedure;
int i = 0;
int totalctrl = Convert.ToInt32(this.ddlNumtoGenerate.SelectedValue.ToString());
while (i < totalctrl)
{
DoInsertToDB(i);
i++;
}
}
private void DoInsertToDB(int ctrlnum)
{
string textboxname ="_ctl" + ctrlnum + ":txtAName";
System.Web.UI.WebControls.TextBox tb = this.FindControl(textboxname) as System.Web.UI.WebControls.TextBox;
cmd.Parameters.Add("@AName", tb.Text);
cmd.ExecuteNonQuery();
}
I got "Object reference not set to an instance of an object." error everytime I run this. Any idea? Thanks in advance.
TMA
|
|
|
|
|
Instead of trying to find the controls, keep the references from when you create them.
---
It's amazing to see how much work some people will go through just to avoid a little bit of work.
|
|
|
|
|
But the id of the textboxes are generated by the dropdown box. For example: How can I reference the 4th textbox on the screen. Please help. Thanks
gsdg
|
|
|
|
|
What do you mean when you say that the textboxes are generated by the dropdown box? A dropdown box does not generate anything by itself.
---
It's amazing to see how much work some people will go through just to avoid a little bit of work.
|
|
|
|
|
I'm having an issue with the changes made to combobox selections being pushed back to a datatable. Hopefully I'll be able to explain things enough to at least get some help.
I have two comboboxes on a form. Each has its dataSource set to a pre-populated table in a dataset. Upon selection of a value in the first one, I change the DataTable.DefaultView.RowFilter on the second combobox's source table to filter the table and only display relevant selctions.
I also have a table which is meant to save the values selected in those two comboboxes. I declare a BindingSource, and set its dataSource to a third table in the dataset. I DataBind the comboboxes' SelectedValue property to the appropriate columns in the 3rd datatable.
Here's my issue.
Upon selecting a value in the first combobox, and then hitting the button that calls .EndEdit on the binding source, only the first combobox's value is moved back into the datatable, and the new second combobox's value is not.
I can select a value in the first, and then re-select the new filtered value, and that will result in a proper binding back to the datatable.
I'm looking for assistance on how to tell the bindingsource to process the new filtered value in the second combobox, since the user has not actually changed the value itself.
Any suggestions?
|
|
|
|