WebPart в Sharepoint зависает после нажатия на ссылку - PullRequest
0 голосов
/ 07 августа 2009

У меня есть пользовательский элемент управления внутри веб-части внутри sharepoint, в который я динамически добавляю несколько кнопок ссылок во время выполнения. каждый при нажатии должен загрузить определенный файл из базы данных. однако, когда нажимается одна из этих кнопок ссылок, этот файл загружается один раз, и затем я не могу нажимать какие-либо другие кнопки или ссылки или даже ту же еще раз в этом пользовательском элементе управления и веб-части. но я все еще могу щелкнуть другие вещи за пределами пользовательского элемента управления и веб-части. у тебя есть идеи? пожалуйста, скажите мне, какую часть кода я могу добавить сюда, если вам нужно что-то проверить. спасибо :) 1001 *

    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
}

странная вещь, что это работает хорошо, когда я помещаю тот же код на страницу asp.net !!

1 Ответ

1 голос
/ 07 августа 2009

Ahmad,

Проверьте следующую ссылку на форумах MSDN, так как я считаю, что ситуация аналогична (если не идентична) описываемой вами:

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

Обсуждается пара различных подходов / решений.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...