0
votes

I have a user control inside a webpart inside sharepoint that I add some linkbuttons dynamically during runtime. each one when clicked is supposed to download a certain file from the database. however when one of those linkbuttons is clicked, this file is downloaded for once and then i can't click any other buttons or links or even the same one again on this user control and webpart. but i can still click other things outside the user control and webpart. do u have any idea? please tell me which part of the code i can add here if you need to check something. thank you :)

    using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using Microsoft.SharePoint;
using System.Collections.Generic;
using System.Drawing;

public class SearchResult : IComparable
{
    private string __nID;
    private string __sQuestion;
    private string __sAnswer;
    private string __nCategoryID;
    private string __nPermission;
    private string __nLastEdit;
    private int __nOccurrence;

    public SearchResult()
    {
        __nOccurrence = 0;
    }

    public string ID
    {
        get { return __nID; }
        set { __nID = value; }
    }
    public string Quest
    {
        get { return __sQuestion; }
        set { __sQuestion = value; }
    }
    public string Answer
    {
        get { return __sAnswer; }
        set { __sAnswer = value; }
    }
    public string CategoryID
    {
        get { return __nCategoryID; }
        set { __nCategoryID = value; }
    }
    public string Permission
    {
        get { return __nPermission; }
        set { __nPermission = value; }
    }
    public string LastEdit
    {
        get { return __nLastEdit; }
        set { __nLastEdit = value; }
    }
    public int Occurrence
    {
        get { return __nOccurrence; }
        set { __nOccurrence = value; }
    }

    #region IComparable Members

    public int CompareTo(SearchResult res)
    {
        if (this.Occurrence > res.Occurrence)
            return -1;
        if (this.Occurrence < res.Occurrence)
            return 1;

        return 0;
    }

    #endregion

    #region IComparable Members

    public int CompareTo(object obj)
    {
        SearchResult res = (SearchResult)obj;
        if (this.Occurrence > res.Occurrence)
            return -1;
        if (this.Occurrence < res.Occurrence)
            return 1;

        return 0;
    }

    #endregion
}

[System.ComponentModel.Description("Questions")]
public partial class SampleProvider : System.Web.UI.UserControl, SmartPart.IConnectionProviderControl
{
    const string FAQConnectionString = "";
    private int FileID = 1;
    private string CaregoryID = "1";

    TextBox tbQuestion;
    TextBox tbAnswer;

    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
            ViewState["CategoryID"] = "0";
            LoadTree();
        }

        System.Web.HttpContext context = System.Web.HttpContext.Current;
        string username = context.User.Identity.Name;

        LoadQuestions();
    }

    void LoadQuestions()
    {
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection();
        con.ConnectionString = FAQConnectionString;

        System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand();
        com.Connection = con;
        com.CommandText = "SELECT * FROM Questions";
        System.Data.SqlClient.SqlDataReader dr;
        con.Open();
        dr = com.ExecuteReader();

        PlaceHolderQuestions.Controls.Clear();

        PlaceHolderQuestions.Controls.Add(new LiteralControl("<br/><br/><br/>"));
        while (dr.Read())
        {
            if (ViewState["CategoryID"].ToString() != dr[3].ToString())
                continue;

            Label question = new Label();
            question.Text = dr[1].ToString();
            question.Font.Name = "Cambria";
            question.Font.Bold = true;
            question.Font.Size = 11;
            question.Width = 500;

            Label answer = new Label();
            answer.Text = dr[2].ToString();
            answer.Font.Name = "Cambria";
            answer.Font.Size = 11;
            answer.Width = 500;

            LinkButton lnkbtnEdit = new LinkButton();
            lnkbtnEdit.Click += new EventHandler(lnkbtnEdit_Click);

            lnkbtnEdit.CommandArgument = dr[0].ToString();
            lnkbtnEdit.CommandName = "edit";

            lnkbtnEdit.Text = "Edit";
            lnkbtnEdit.Font.Name = "Cambria";
            lnkbtnEdit.Font.Size = 11;
            lnkbtnEdit.Width = 50;

            PlaceHolderQuestions.Controls.Add(question);
            PlaceHolderQuestions.Controls.Add(new LiteralControl("<br/>"));

            PlaceHolderQuestions.Controls.Add(answer);
            PlaceHolderQuestions.Controls.Add(new LiteralControl("<br/>"));

            System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection();
            conn.ConnectionString = FAQConnectionString;

            System.Data.SqlClient.SqlCommand comm = new System.Data.SqlClient.SqlCommand();
            comm.Connection = conn;
            /////////////////////////// dr[2] for the QuestionID column at the question table
            comm.CommandText = "SELECT * FROM Files WHERE QuestionID = " + dr[0].ToString();
            System.Data.SqlClient.SqlDataReader drr;

            conn.Open();
            drr = comm.ExecuteReader();

            while (drr.Read())
            {
                LinkButton lnkbtnDownloadFile = new LinkButton();

                //name of the file ---> drr[2]
                lnkbtnDownloadFile.Click += new EventHandler(lnkbtnDownloadFile_Click);
                lnkbtnDownloadFile.Text = drr[2].ToString();
                lnkbtnDownloadFile.CommandArgument = drr[2].ToString();


                PlaceHolderQuestions.Controls.Add(lnkbtnDownloadFile);
                PlaceHolderQuestions.Controls.Add(new LiteralControl("<br/>"));
            }

            ShowLabels(dr[0].ToString());




            conn.Close();
            PlaceHolderQuestions.Controls.Add(lnkbtnEdit);
            PlaceHolderQuestions.Controls.Add(new LiteralControl("<p/>"));

        }
        con.Close();

    }

    void EditQuestion(string ID)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = FAQConnectionString;
        SqlCommand com = new SqlCommand("SELECT * FROM Questions WHERE ID = '" + ID + "'");
        com.Connection = con;
        SqlDataReader dr;
        con.Open();

        string quest="";
        string answer = "";
        string categoryID = "";
        string lastEdit = "";

        dr = com.ExecuteReader();

        while (dr.Read())
        {
            quest = dr[1].ToString();
            answer = dr[2].ToString();
            categoryID = dr[3].ToString();
            lastEdit = dr[5].ToString();
        }


        tbQuestion = new TextBox();
        tbAnswer = new TextBox();

        tbQuestion.TextMode = TextBoxMode.MultiLine;
        tbAnswer.TextMode = TextBoxMode.MultiLine;

        tbQuestion.Width = 360;
        tbAnswer.Width = 360;

        tbQuestion.Text = quest;
        tbAnswer.Text = answer;

        PlaceHolderQuestions.Controls.Clear();
        PlaceHolderQuestions.Controls.Add(tbQuestion);
        PlaceHolderQuestions.Controls.Add(tbAnswer);


        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = FAQConnectionString;

        SqlCommand comm = new SqlCommand();
        comm.Connection = conn;
        /////////////////////////// dr[2] for the QuestionID column at the question table
        comm.CommandText = "SELECT * FROM Files WHERE QuestionID = " + ID;
        SqlDataReader drr;

        conn.Open();
        drr = comm.ExecuteReader();

        PlaceHolder PlaceHolderFiles = new PlaceHolder();
        PlaceHolderQuestions.Controls.Add(PlaceHolderFiles);

        // for showing links to the files
        while (drr.Read())
        {
            LinkButton lb = new LinkButton();

            //name of the file ---> drr[2]
       //     lb.Click += new EventHandler(lb_Click);
            lb.Text = drr[2].ToString();

            PlaceHolderFiles.Controls.Add(lb);


            LinkButton lnkbtnDelete = new LinkButton();
            //      lnkbtnDelete.Click+= new EventHandler(delete_Click);
            lnkbtnDelete.CommandArgument = lb.Text;
            lnkbtnDelete.Text = "Delete";
            lnkbtnDelete.Width = 60;
            lnkbtnDelete.Height = 25;
            PlaceHolderFiles.Controls.Add(lnkbtnDelete);

            PlaceHolderFiles.Controls.Add(new LiteralControl("<br/>"));
        }

        LinkButton lnkbtnSave = new LinkButton();
        lnkbtnSave.Click += new EventHandler(lnkbtnSave_Click);
        lnkbtnSave.Text = "Save";
        PlaceHolderQuestions.Controls.Add(lnkbtnSave);

        conn.Close();   
    }

    void lnkbtnSave_Click(object sender, EventArgs e)
    {
        if (sender is LinkButton && (sender as LinkButton).CommandName == "save")
            SaveQuestion((sender as LinkButton).CommandArgument);
    }

    private  void UpdateQuestionByID(int questionID, string question, string answer, string lastEdited)
    {
        using (SqlConnection conn = new SqlConnection(FAQConnectionString))
        {
            conn.Open();
            const string QUERY =
                @"UPDATE Questions " +
                @"SET Question = @Question, Answer = @Answer, LastEdit = @LastEdited " +
                @"WHERE ID = @QuestionID";
            using (SqlCommand cmd = new SqlCommand(QUERY, conn))
            {
                cmd.Parameters.AddWithValue("@Question", question);
                cmd.Parameters.AddWithValue("@Answer", answer);
                cmd.Parameters.AddWithValue("@LastEdited", lastEdited);
                cmd.Parameters.AddWithValue("@QuestionID", questionID);
                cmd.ExecuteNonQuery();
            }
        }
    }

    void SaveQuestion(string ID)
    {
        UpdateQuestionByID(int.Parse(ID), tbQuestion.Text, tbAnswer.Text, "a");
    }

    void lnkbtnEdit_Click(object sender, EventArgs e)
    {
        //if (sender is LinkButton && (sender as LinkButton).CommandName=="edit") 
        //    EditQuestion((sender as LinkButton).CommandArgument);
        string id = (sender as LinkButton).CommandArgument.ToString();
        Response.Redirect("http://kermit:91/BIMS/Shared%20Documents/EditQuestion.aspx?k="+id);
        ViewState["EditID"] = (sender as LinkButton).CommandArgument;
    }

    void lnkbtnDownloadFile_Click(object sender, EventArgs e)
    {
        if (sender is LinkButton)
            DownloadFile((sender as LinkButton).CommandArgument);
    }

    private void DownloadFile(string fileName)
    {
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection();
        con.ConnectionString = FAQConnectionString;
        con.Open();

        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
        cmd.Connection = con;

        cmd.CommandText = "SELECT * FROM Files WHERE FileName = @ID";
        cmd.Parameters.Add("@ID", System.Data.SqlDbType.NVarChar).Value = fileName;
        System.Data.SqlClient.SqlDataReader sqlRead = cmd.ExecuteReader();
        if (sqlRead.HasRows)
        {
            while (sqlRead.Read())
            {
                byte[] fileData = (byte[])sqlRead[3];

                Response.Clear();
                Response.AppendHeader("content-disposition", "attachment; filename=" + sqlRead[2]);
                Response.ContentType = "application/octet-stream";
                Response.BinaryWrite(fileData);
                //Response.Flush();
                //Response.End();
                Response.Clear();
            }
        }
        con.Close();
        sqlRead.Close();

    }

    protected void lnkbtnAddQuestion_Click(object sender, EventArgs e)
    {

    }

    private void LoadTree()
    {
        tvCategory.Nodes.Clear();
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection();
        con.ConnectionString = FAQConnectionString;

        System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand();
        com.Connection = con;
        com.CommandText = "SELECT * FROM QuestionCategory WHERE ParentCategoryID = -1";
        System.Data.SqlClient.SqlDataReader dr;
        con.Open();
        dr = com.ExecuteReader();

        while (dr.Read())
        {
            TreeNode tn = new TreeNode();
            tn.Text = dr[1].ToString();
            tn.Value = dr[0].ToString();

            tvCategory.Nodes.Add(tn);
            AddChildren(tn);
        }
        con.Close();
    }

    private void AddChildren(TreeNode tn)
    {
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection();
        con.ConnectionString = FAQConnectionString;

        System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand();
        com.Connection = con;
        com.CommandText = "SELECT * FROM QuestionCategory WHERE ParentCategoryID = " + tn.Value;
        System.Data.SqlClient.SqlDataReader dr;
        con.Open();
        dr = com.ExecuteReader();

        while (dr.Read())
        {
            TreeNode ctn = new TreeNode();
            ctn.Text = dr[1].ToString();
            ctn.Value = dr[0].ToString();

            tn.ChildNodes.Add(ctn);
            AddChildren(ctn);
        }
        con.Close();
    }

    protected void tvCategory_SelectedNodeChanged(object sender, EventArgs e)
    {
        ViewState["CategoryID"] = tvCategory.SelectedValue;
      //  CaregoryID = tvCategory.SelectedValue;

        LoadQuestions();
        tvCategory.SelectedNode.Selected = false;
    }

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection();
        con.ConnectionString = FAQConnectionString;

        SqlDataAdapter adp = new SqlDataAdapter();
        DataTable QuestionsTable = new DataTable();
        using (SqlConnection oCn = new SqlConnection(FAQConnectionString))
        {
            SqlCommand cmd = new SqlCommand("SELECT * FROM Questions", oCn);
            cmd.CommandType = CommandType.Text;
            adp.SelectCommand = cmd;
            adp.Fill(QuestionsTable);
        }

        List<String> wordsSearched = new List<string>();
        List<SearchResult> searchResults = new List<SearchResult>();

        string[] words = txtbxSearch.Text.ToLower().Split();

        //filtering the unnecessary words to prevent searching for
        foreach (string s in words)
        {
            if (s == "to" || s == "the" || s == "is" || s == "are" || s == "in" || s == "of" || s == "on" || s == "with" || s == "are" || s == "it" || s == "this")
                continue;
            wordsSearched.Add(s);
        }

        //adding the search result and determine the frequency of occurrence
        for (int i = 0; i < QuestionsTable.Rows.Count; i++)
            foreach (string w in wordsSearched)
                if (QuestionsTable.Rows[i][1].ToString().ToLower().IndexOf(w) > -1 || QuestionsTable.Rows[i][2].ToString().ToLower().IndexOf(w) > -1)
                {
                    SearchResult result = new SearchResult();
                    result.ID = QuestionsTable.Rows[i][0].ToString();
                    result.Quest = QuestionsTable.Rows[i][1].ToString();
                    result.Answer = QuestionsTable.Rows[i][2].ToString();
                    result.CategoryID = QuestionsTable.Rows[i][3].ToString();
                    result.Permission = QuestionsTable.Rows[i][4].ToString();
                    result.LastEdit = QuestionsTable.Rows[i][5].ToString();
                    result.Occurrence++;

                    bool isFound = false;
                    for (int j = 0; j < searchResults.Count; j++)
                        if (searchResults[j].ID == result.ID)
                        {
                            searchResults[j].Occurrence++;
                            isFound = true;
                            break;
                        }

                    if (!isFound)
                        searchResults.Add(result);
                }

        SearchInTags(wordsSearched, searchResults);
        searchResults.Sort();
        //Session["SearchResults"] = searchResults;
        //Response.Redirect("SearchResults.aspx");


        LoadSearchResults(searchResults, wordsSearched);
    }

    void SearchInTags(List<string> words, List<SearchResult> searchResults)
    {
        foreach (string s in words)
        {
            using (SqlConnection con = new SqlConnection(FAQConnectionString))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("SELECT * FROM Questions INNER JOIN QuestionKeyword ON Questions.ID=QuestionKeyword.QuestionID INNER JOIN Keywords  ON QuestionKeyword.KeywordID=Keywords.ID WHERE Keywords.Keyword LIKE '%" + s + "%'", con);
                SqlDataReader dr;
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    SearchResult result = new SearchResult();
                    result.ID = dr[0].ToString();
                    result.Quest = dr[1].ToString();
                    result.Answer = dr[2].ToString();
                    result.CategoryID = dr[3].ToString();
                    result.Permission = dr[4].ToString();
                    result.LastEdit = dr[5].ToString();
                    result.Occurrence++;

                    bool isFound = false;
                    for (int j = 0; j < searchResults.Count; j++)
                        if (searchResults[j].ID == result.ID)
                        {
                            searchResults[j].Occurrence++;
                            isFound = true;
                            break;
                        }

                    if (!isFound)
                        searchResults.Add(result);
                }
            }
        }

    }

    string[] ColorWords(string[] words, string color, List<string> selected)
    {
        for (int i = 0; i < words.Length; i++)
            for(int j=0; j<selected.Count; j++)
                if(words[i].ToLower()==selected[j].ToLower())
                {
                    words[i] = "<span style='color: red;'>" + words[i] + "</span>";
                    break;
                }

        return words;

    }


    string ColorText(string text, List<string> selected)
    {
        int searchFrom = 0;
        foreach (string s in selected)
        {
            int startIndex = text.ToLower().IndexOf(s, searchFrom);
            if (startIndex < 0)
                continue;

            int length = s.Length;
            text = text.Insert(startIndex, "<span style='color: red;'>");
            text = text.Insert(startIndex + length + 26, "</span>");
        }

        return text;
    }

    void LoadSearchResults(List<SearchResult> searchResults, List<string> selected)
    {

        PlaceHolderQuestions.Controls.Clear();

        foreach (SearchResult res in searchResults)
        {
            Label question = new Label();
            question.Text = ColorText(res.Quest, selected);
            question.Font.Name = "Cambria";
            question.Font.Bold = true;
            question.Font.Size = 11;
            question.Width = 500;

            Label answer = new Label();
            answer.Text = ColorText(res.Answer, selected);
            answer.Font.Name = "Cambria";
            answer.Font.Size = 11;
            answer.Width = 500;

            HyperLink edit = new HyperLink();

            string url = "http://kermit:91/BIMS/Shared%20Documents/EditQuestion.aspx?k=";
            url += res.ID;


            edit.NavigateUrl = url;
            edit.Text = "Edit";
            edit.Font.Name = "Cambria";
            edit.Font.Size = 11;
            edit.Width = 50;



            PlaceHolderQuestions.Controls.Add(question);
            PlaceHolderQuestions.Controls.Add(new LiteralControl("<br/>"));

            PlaceHolderQuestions.Controls.Add(answer);
            PlaceHolderQuestions.Controls.Add(new LiteralControl("<br/>"));

            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = FAQConnectionString;

            SqlCommand comm = new SqlCommand();
            comm.Connection = conn;
            /////////////////////////// dr[2] for the QuestionID column at the question table
            comm.CommandText = "SELECT * FROM Files WHERE QuestionID = " + res.ID;
            SqlDataReader drr;

            conn.Open();
            drr = comm.ExecuteReader();

            while (drr.Read())
            {
                LinkButton lb = new LinkButton();


                //name of the file ---> drr[2]
                //            lb.Click += new EventHandler(lb_Click);
                lb.Text = drr[2].ToString();

                PlaceHolderQuestions.Controls.Add(lb);
                PlaceHolderQuestions.Controls.Add(new LiteralControl("<br/>"));
            }

            ShowLabels(res.ID);

            conn.Close();
            PlaceHolderQuestions.Controls.Add(edit);
            PlaceHolderQuestions.Controls.Add(new LiteralControl("<p/>"));

        }
    }

    void ShowLabels(string questionID)
    {
        SqlConnection con = new SqlConnection(FAQConnectionString);
        SqlCommand cmd = new SqlCommand();
        cmd.CommandText = "SELECT * FROM QuestionKeyword INNER JOIN Keywords ON QuestionKeyword.KeyWordID=Keywords.ID  WHERE QuestionID = " + questionID;
        cmd.Connection = con;
        SqlDataReader dr;
        con.Open();
        dr = cmd.ExecuteReader();

        while (dr.Read())
        {
            Label lblKeyword = new Label();
            lblKeyword.ForeColor = Color.Green;
            lblKeyword.Text = dr[4].ToString();
            PlaceHolderQuestions.Controls.Add(lblKeyword);
            PlaceHolderQuestions.Controls.Add(new LiteralControl(" \t "));
        }


        con.Close();

        PlaceHolderQuestions.Controls.Add(new LiteralControl("<p/>"));
    }


    #region IConnectionProviderControl Members

    public object GetProviderData()
    {
        return null;
    }

    public string ProviderMenuLabel
    {
        get { return "Sends text data to"; }
    }

    #endregion
}
3
Probably because the linkbutton does a postback and on the postback the urls are not set to the linkbuttons again? Can you post your webpart code?ArjanP
i added the code, its too long though. thanks for your patience.Ahmad Farid
the weird thing that it works well when i put the same code in an asp.net page!!Ahmad Farid

3 Answers

1
votes

Ahmad,

Check out the following link on the MSDN forums, as I believe the situation is similar (if not identical) to what you're describing:

http://social.msdn.microsoft.com/forums/en-US/sharepointdevelopment/thread/107b2c17-07fe-4a15-ad81-dcb31e1e9c84/

A couple of different approaches/solutions are discusssed.

I hope this helps!

1
votes
private byte[] GetFile(string fileID, ref string  name)
    {
        System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection();
        con.ConnectionString = FAQConnectionString;
        con.Open();

        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
        cmd.Connection = con;

        cmd.CommandText = "SELECT * FROM Files WHERE ID = @ID";
        cmd.Parameters.Add("@ID", System.Data.SqlDbType.Int).Value = fileID;
        System.Data.SqlClient.SqlDataReader sqlRead = cmd.ExecuteReader();
        if (sqlRead.HasRows)
        {
            while (sqlRead.Read())
            {
                name = sqlRead[2].ToString();
                byte[] fileData = (byte[])sqlRead[3];
                return fileData;

            }
        }
        return null;
    }
0
votes

Without looking at your code its really hard to say, but you MUST be careful about when you set properties on the controls inside your user control/web part.

The lifecycle of web parts has a slight quirk. I have blogged about it here:

http://f5todebug.wordpress.com/2009/07/17/the-web-part-life-cycle/

Hope it helps!